2017-07-04 152 views
0

我想弄清楚各种头文件中的整型定义是如何相互关联的。如何使用GNU C预处理器预定义的宏?

我刚安装了CygWin。我打开了Cygwin\x86\usr\include\machine\_default_types.h。在它我注意到下面的代码片断:

#ifdef __INT8_TYPE__ 
typedef __INT8_TYPE__ __int8_t; 

根据here,所述__INT8_TYPE__是预定义的预处理器宏之一。和:

你不应该直接使用这些宏;相反,请包含 适当的标题并使用typedefs。如果GCC在这些系统上未提供stdint.h 标头,则可能会在特定系统上定义这些宏中的某些宏。

所以看来__INT8_TYPE__应该在其他地方定义。但是我搜索了整个CygWin的安装,没有定义它。我发现的一切都是像上面那样的一些条件性陈述。

因为我不应该直接使用它。没有其他文件正在定义它。这个宏如何能够实施?还是我误解了一些东西?

回答

4

这是一个预定义的宏。看到他们,你可以:

gcc -dM -E - < /dev/null 

例如为:

$ 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

所以...它是内置到编译器为特定平台,我不能改变呢? – smwikipedia

+0

@smwikipedia它们绝对是平台和编译器特有的。这很可能是不可修改的。 – ldav1s

+1

我真的应该说“不可修改”的是这些宏是[保留标识符](http://en.cppreference.com/w/c/language/identifier#Reserved_identifiers),不应该由一个程序(UB)。你可以避开它,但是当你链接到另一个库(例如'libc')时,你重新定义的'int8_t'不会匹配'libc'的'int8_t'的大小和/或符号(除非它是一个微不足道的重新定义 - 但这有什么意义?),所以各种有趣的破坏会随之而来。 – ldav1s