Czytam „Standardową bibliotekę C” PJ Plaugera, co jest naprawdę interesujące. Książka wyjaśnia nie tylko, jak KORZYSTAĆ z biblioteki, ale także sposób jej implementacji.
Skończyłem czytać ctype.h
sekcję, aw nagłówku funkcje są zadeklarowane zarówno jako makra ORAZ funkcje. Na przykład
int isdigit(int);
ale również
#define isdigit(c) (_Ctype[(int)(c)] & _DI)
Nie rozumiem, dlaczego OBU używane są?
Ponadto, jeśli spróbuję odtworzyć własny niestandardowy ctype
nagłówek i implementację, mogę pomyślnie skompilować tylko po usunięciu makra (skomentuj definicję).
Ten aspekt nie został tak naprawdę wyjaśniony w książce. Czy ktoś może wyjaśnić?
Odpowiedzi:
Makro jest (przypuszczalnie) bardziej wydajne, ponieważ nie wymaga wywołania funkcji. Można go łatwiej zoptymalizować, ponieważ wymaga tylko wyszukiwania przesunięcia wskaźnika.
Wywołanie funkcji pozwala na połączenie z tą samą biblioteką, nawet jeśli program został skompilowany bez definicji makra - jeśli został skompilowany z innym nagłówkiem lub tylko z nieuczciwą deklaracją w pliku źródłowym. Jeśli, na przykład, masz kompilator, który ma czyjąś „ulepszoną” wersję ctype.h, która nie ma makra, funkcja nadal istniałaby w czasie wykonywania do użycia.
Jeśli spojrzymy na standard:
Oznacza to, że jeśli napiszesz:
lub
następnie wywołujesz rzeczywistą funkcję, a nie makro. Możesz również legalnie napisać:
lub (w pliku źródłowym nieposiadającym
#include <ctype.h>
bezpośrednio ani przejściowo):źródło
extern int isdigit(int)
, na przykład.