2017-07-04 1 views
0

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?

Répondre

4

Il s'agit d'une macro prédéfinie. Pour les voir, vous pouvez:

gcc -dM -E - < /dev/null 

.: par exemple

$ gcc -dM -E - < /dev/null | grep __INT 
#define __INTMAX_C(c) C## L 
#define __INT8_C(c) c 
#define __INT64_C(c) C## L 
#define __INT32_MAX__ 0x7fffffff 
#define __INT_FAST32_MAX__ 0x7fffffffffffffffL 
#define __INT_FAST16_TYPE__ long int 
#define __INT_LEAST32_MAX__ 0x7fffffff 
#define __INT_FAST64_TYPE__ long int 
#define __INT32_C(c) c 
#define __INT_FAST32_TYPE__ long int 
#define __INT16_MAX__ 0x7fff 
#define __INT8_TYPE__ signed char 
#define __INT_LEAST16_TYPE__ short int 
#define __INT_FAST16_MAX__ 0x7fffffffffffffffL 
#define __INT_LEAST16_MAX__ 0x7fff 
#define __INT64_MAX__ 0x7fffffffffffffffL 
#define __INT_LEAST64_TYPE__ long int 
#define __INT16_TYPE__ short int 
#define __INT_LEAST8_TYPE__ signed char 
#define __INT_FAST8_MAX__ 0x7f 
#define __INTPTR_MAX__ 0x7fffffffffffffffL 
#define __INTPTR_TYPE__ long int 
#define __INT_FAST64_MAX__ 0x7fffffffffffffffL 
#define __INT_MAX__ 0x7fffffff 
#define __INT64_TYPE__ long int 
#define __INT_LEAST64_MAX__ 0x7fffffffffffffffL 
#define __INT_LEAST8_MAX__ 0x7f 
#define __INT_LEAST32_TYPE__ int 
#define __INT_FAST8_TYPE__ signed char 
#define __INTMAX_MAX__ 0x7fffffffffffffffL 
#define __INT8_MAX__ 0x7f 
#define __INT32_TYPE__ int 
#define __INTMAX_TYPE__ long int 
#define __INT16_C(c) c 
+1

alors ... il est construit dans le compilateur pour une plate-forme spécifique et je ne peux pas le changer? – smwikipedia

+0

@smwikipedia Ils sont certainement spécifiques à la plate-forme et au compilateur. Il est probable qu'ils ne sont pas modifiables. – ldav1s

+1

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