J'essaie de comprendre comment les définitions de types entiers provenant de divers fichiers d'en-tête sont liées les unes aux autres.Comment les macros prédéfinies du préprocesseur GNU C sont-elles utilisées?
Je viens d'installer le CygWin. J'ai ouvert le Cygwin\x86\usr\include\machine\_default_types.h
. Dans ce document, j'ai remarqué ci-dessous des extraits de code:
#ifdef __INT8_TYPE__
typedef __INT8_TYPE__ __int8_t;
Selon here, le __INT8_TYPE__
est l'une des macros pré-processeur prédéfinies. Et:
Vous ne devez pas utiliser ces macros directement; à la place, incluez les en-têtes appropriés et utilisez les typedefs. Certaines de ces macros peuvent ne pas être définies sur des systèmes particuliers si GCC ne fournit pas un en-tête stdint.h sur ces systèmes.
Il semble donc que le __INT8_TYPE__
devrait être défini ailleurs. Mais j'ai cherché toute l'installation de CygWin, il n'y a pas de définition pour ça. Tout ce que j'ai trouvé sont des énoncés conditionnels comme ci-dessus.
Comme je ne devrais pas l'utiliser directement. Et aucun autre fichier ne le définit. Comment cette macro pourrait-elle jamais entrer en action? Ou ai-je mal compris quelque chose?
alors ... il est construit dans le compilateur pour une plate-forme spécifique et je ne peux pas le changer? – smwikipedia
@smwikipedia Ils sont certainement spécifiques à la plate-forme et au compilateur. Il est probable qu'ils ne sont pas modifiables. – ldav1s
Ce que j'aurais vraiment dû dire à propos de "non-modifiable", c'est que ces macros sont [identifiants réservés] (http://en.cppreference.com/w/c/language/identifier#Reserved_identifiers) et ne devraient pas être déclarées par un programme (UB). Vous pouvez être en mesure de vous en sortir, mais lorsque vous liez une autre bibliothèque (par exemple 'libc'), votre redéfini' int8_t' ne correspondra pas à 'libc's' int8_t' en taille et/ou en signature (sauf si c'est une redéfinition triviale - mais à quoi cela sert-il?) et ainsi toutes sortes de bris de plaisir peuvent s'ensuivre. – ldav1s