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的安装,没有定义它。我发现的一切都是像上面那样的一些条件性陈述。
因为我不应该直接使用它。没有其他文件正在定义它。这个宏如何能够实施?还是我误解了一些东西?
所以...它是内置到编译器为特定平台,我不能改变呢? – smwikipedia
@smwikipedia它们绝对是平台和编译器特有的。这很可能是不可修改的。 – ldav1s
我真的应该说“不可修改”的是这些宏是[保留标识符](http://en.cppreference.com/w/c/language/identifier#Reserved_identifiers),不应该由一个程序(UB)。你可以避开它,但是当你链接到另一个库(例如'libc')时,你重新定义的'int8_t'不会匹配'libc'的'int8_t'的大小和/或符号(除非它是一个微不足道的重新定义 - 但这有什么意义?),所以各种有趣的破坏会随之而来。 – ldav1s