Ich lese gerade 'The Standard C Library' von PJ Plauger, was wirklich interessant ist. Das Buch erklärt nicht nur, wie die Bibliothek NUTZT wird, sondern auch, wie sie implementiert wird.
Ich habe den ctype.h
Abschnitt gelesen und in der Kopfzeile sind die Funktionen als Makros UND Funktionen deklariert. Beispielsweise
int isdigit(int);
aber auch
#define isdigit(c) (_Ctype[(int)(c)] & _DI)
Ich verstehe nicht, warum beide verwendet werden?
Wenn ich versuche, meinen eigenen benutzerdefinierten ctype
Header und meine Implementierung neu zu erstellen , kann ich nur dann erfolgreich kompilieren, wenn ich das Makro entferne (das Define auskommentiere).
Dieser Aspekt wurde im Buch nicht wirklich erklärt. Kann jemand bitte erklären?
Antworten:
Das Makro ist (mutmaßlich) effizienter, da es keinen Funktionsaufruf enthält. Es kann einfacher optimiert werden, da nur ein Zeiger-Offset-Lookup erforderlich ist.
Der Funktionsaufruf ermöglicht das Verknüpfen mit derselben Bibliothek, auch wenn das Programm ohne die Makrodefinition kompiliert wurde - wenn es mit einem anderen Header kompiliert wurde oder nur mit einer falschen Deklaration in der Quelldatei. Wenn Sie beispielsweise einen Compiler mit einer "verbesserten" Version von ctype.h haben, der kein Makro enthält, ist die Funktion zur Laufzeit noch verfügbar .
Wenn wir uns den Standard ansehen:
Das heißt, wenn Sie schreiben:
oder
dann rufen Sie die eigentliche Funktion auf, nicht das Makro. Sie können auch legal schreiben:
oder (in einer Quelldatei nicht
#include <ctype.h>
direkt oder transitiv):quelle
extern int isdigit(int)
zum Beispiel mit.