Je lis «The Standard C Library» de PJ Plauger, ce qui est vraiment intéressant. Le livre explique non seulement comment UTILISER la bibliothèque mais aussi comment elle est implémentée.
J'ai fini de lire la ctype.h
section et dans l'en-tête les fonctions sont déclarées à la fois comme macros ET fonctions. Par exemple
int isdigit(int);
mais aussi
#define isdigit(c) (_Ctype[(int)(c)] & _DI)
Je ne comprends pas pourquoi les DEUX sont utilisés?
De plus, si j'essaie de recréer mon propre en- ctype
tête et implémentation personnalisés, je ne peux compiler avec succès que si je supprime la macro (commentez la définition).
Cet aspect n'était pas vraiment expliqué dans le livre. Quelqu'un peut-il expliquer?
Réponses:
La macro est (putativement) plus efficace, car elle n'implique pas d'appel de fonction. Il peut être optimisé plus facilement, car il implique simplement une recherche de décalage de pointeur.
L'appel de fonction permet de créer des liens avec la même bibliothèque même si le programme a été compilé sans la définition de macro - s'il a été compilé avec un en-tête différent, ou simplement avec une déclaration non autorisée à l'intérieur du fichier source. Si, par exemple, vous avez un compilateur qui a la version "améliorée" de quelqu'un de ctype.h qui n'avait pas la macro, la fonction existerait toujours au moment de l'exécution pour être utilisée.
Si nous regardons la norme:
Cela signifie que si vous écrivez:
ou
alors vous appelez la fonction réelle, pas la macro. Vous pouvez également légalement écrire:
ou (dans un fichier source n'ayant pas
#include <ctype.h>
directement ou transitivement):la source
extern int isdigit(int)
, par exemple.