首页 文章

为什么C预处理器将单词“linux”解释为常量“1”?

提问于
浏览
941

为什么GCC中的C预处理器将单词 linux (小写字母)解释为常量 1

test.c的:

#include <stdio.h>
int main(void)
{       
    int linux = 5;
    return 0;
}

$ gcc -E test.c 的结果(在预处理阶段后停止):

....
int main(void)
{
    int 1 = 5;
    return 0;
}

哪个 - 当然 - 会产生错误 .

(顺便说一句:stdio.h文件中没有 #define linux . )

5 回答

  • 65

    这似乎是一个(无证件)"GNU extension":[更正:我终于在文档中提到了一个提及 . 见下文 . ]

    以下命令使用 -dM 选项打印所有预处理器定义;由于输入"file"为空,它显示预定义的宏 . 它在标准的ubuntu安装上使用gcc-4.7.3运行 . 您可以看到预处理器是标准感知的 . 总共有243个宏 -std=gnu99 和240个 -std=c99 ;我过滤了输出的相关性 .

    $ cpp --std=c89 -dM < /dev/null | grep linux
    #define __linux 1
    #define __linux__ 1
    #define __gnu_linux__ 1
    
    $ cpp --std=gnu89 -dM < /dev/null | grep linux
    #define __linux 1
    #define __linux__ 1
    #define __gnu_linux__ 1
    #define linux 1
    
    $ cpp --std=c99 -dM < /dev/null | grep linux
    #define __linux 1
    #define __linux__ 1
    #define __gnu_linux__ 1
    
    $ cpp --std=gnu99 -dM < /dev/null | grep linux
    #define __linux 1
    #define __linux__ 1
    #define __gnu_linux__ 1
    #define linux 1
    

    "gnu standard"版本也 #define unix . (使用 c11gnu11 会产生相同的结果 . )

    我想他们有他们的理由,但在我看来,gcc的默认安装(除非另有说明,否则编译C代码 -std=gnu89 )不符合,并且 - 正如在这个问题中 - 令人惊讶 . 在一致的实现中,不允许使用名称不以下划线开头的宏来粉碎全局命名空间 . (6.8.10p2:"Any other predefined macro names shall begin with a leading underscore followed by an uppercase letter or a second underscore,"但是,如附录J.5(可移植性问题)中所述,这些名称通常是预定义的 . )

    当我最初写这个答案时,我无法在gcc中找到关于这个问题的任何文档,但我终于发现了它,不是在C implementation-defined behaviour中,也不是在C extensions中,而是在 cpp 手册部分3.7.3中,它注意到:

    我们正在逐步淘汰保留命名空间之外的所有预定义宏 . 你永远不应该在新程序中使用它们......

  • 40

    使用此命令

    gcc -dM -E - < /dev/null
    

    得到这个

    #define _LP64 1
    #define _STDC_PREDEF_H 1
    #define __ATOMIC_ACQUIRE 2
    #define __ATOMIC_ACQ_REL 4
    #define __ATOMIC_CONSUME 1
    #define __ATOMIC_HLE_ACQUIRE 65536
    #define __ATOMIC_HLE_RELEASE 131072
    #define __ATOMIC_RELAXED 0
    #define __ATOMIC_RELEASE 3
    #define __ATOMIC_SEQ_CST 5
    #define __BIGGEST_ALIGNMENT__ 16
    #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
    #define __CHAR16_TYPE__ short unsigned int
    #define __CHAR32_TYPE__ unsigned int
    #define __CHAR_BIT__ 8
    #define __DBL_DECIMAL_DIG__ 17
    #define __DBL_DENORM_MIN__ ((double)4.94065645841246544177e-324L)
    #define __DBL_DIG__ 15
    #define __DBL_EPSILON__ ((double)2.22044604925031308085e-16L)
    #define __DBL_HAS_DENORM__ 1
    #define __DBL_HAS_INFINITY__ 1
    #define __DBL_HAS_QUIET_NAN__ 1
    #define __DBL_MANT_DIG__ 53
    #define __DBL_MAX_10_EXP__ 308
    #define __DBL_MAX_EXP__ 1024
    #define __DBL_MAX__ ((double)1.79769313486231570815e+308L)
    #define __DBL_MIN_10_EXP__ (-307)
    #define __DBL_MIN_EXP__ (-1021)
    #define __DBL_MIN__ ((double)2.22507385850720138309e-308L)
    #define __DEC128_EPSILON__ 1E-33DL
    #define __DEC128_MANT_DIG__ 34
    #define __DEC128_MAX_EXP__ 6145
    #define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
    #define __DEC128_MIN_EXP__ (-6142)
    #define __DEC128_MIN__ 1E-6143DL
    #define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL
    #define __DEC32_EPSILON__ 1E-6DF
    #define __DEC32_MANT_DIG__ 7
    #define __DEC32_MAX_EXP__ 97
    #define __DEC32_MAX__ 9.999999E96DF
    #define __DEC32_MIN_EXP__ (-94)
    #define __DEC32_MIN__ 1E-95DF
    #define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF
    #define __DEC64_EPSILON__ 1E-15DD
    #define __DEC64_MANT_DIG__ 16
    #define __DEC64_MAX_EXP__ 385
    #define __DEC64_MAX__ 9.999999999999999E384DD
    #define __DEC64_MIN_EXP__ (-382)
    #define __DEC64_MIN__ 1E-383DD
    #define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD
    #define __DECIMAL_BID_FORMAT__ 1
    #define __DECIMAL_DIG__ 21
    #define __DEC_EVAL_METHOD__ 2
    #define __ELF__ 1
    #define __FINITE_MATH_ONLY__ 0
    #define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__
    #define __FLT_DECIMAL_DIG__ 9
    #define __FLT_DENORM_MIN__ 1.40129846432481707092e-45F
    #define __FLT_DIG__ 6
    #define __FLT_EPSILON__ 1.19209289550781250000e-7F
    #define __FLT_EVAL_METHOD__ 0
    #define __FLT_HAS_DENORM__ 1
    #define __FLT_HAS_INFINITY__ 1
    #define __FLT_HAS_QUIET_NAN__ 1
    #define __FLT_MANT_DIG__ 24
    #define __FLT_MAX_10_EXP__ 38
    #define __FLT_MAX_EXP__ 128
    #define __FLT_MAX__ 3.40282346638528859812e+38F
    #define __FLT_MIN_10_EXP__ (-37)
    #define __FLT_MIN_EXP__ (-125)
    #define __FLT_MIN__ 1.17549435082228750797e-38F
    #define __FLT_RADIX__ 2
    #define __FXSR__ 1
    #define __GCC_ASM_FLAG_OUTPUTS__ 1
    #define __GCC_ATOMIC_BOOL_LOCK_FREE 2
    #define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
    #define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
    #define __GCC_ATOMIC_CHAR_LOCK_FREE 2
    #define __GCC_ATOMIC_INT_LOCK_FREE 2
    #define __GCC_ATOMIC_LLONG_LOCK_FREE 2
    #define __GCC_ATOMIC_LONG_LOCK_FREE 2
    #define __GCC_ATOMIC_POINTER_LOCK_FREE 2
    #define __GCC_ATOMIC_SHORT_LOCK_FREE 2
    #define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
    #define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
    #define __GCC_HAVE_DWARF2_CFI_ASM 1
    #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
    #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
    #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
    #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
    #define __GCC_IEC_559 2
    #define __GCC_IEC_559_COMPLEX 2
    #define __GNUC_MINOR__ 3
    #define __GNUC_PATCHLEVEL__ 0
    #define __GNUC_STDC_INLINE__ 1
    #define __GNUC__ 6
    #define __GXX_ABI_VERSION 1010
    #define __INT16_C(c) c
    #define __INT16_MAX__ 0x7fff
    #define __INT16_TYPE__ short int
    #define __INT32_C(c) c
    #define __INT32_MAX__ 0x7fffffff
    #define __INT32_TYPE__ int
    #define __INT64_C(c) c ## L
    #define __INT64_MAX__ 0x7fffffffffffffffL
    #define __INT64_TYPE__ long int
    #define __INT8_C(c) c
    #define __INT8_MAX__ 0x7f
    #define __INT8_TYPE__ signed char
    #define __INTMAX_C(c) c ## L
    #define __INTMAX_MAX__ 0x7fffffffffffffffL
    #define __INTMAX_TYPE__ long int
    #define __INTPTR_MAX__ 0x7fffffffffffffffL
    #define __INTPTR_TYPE__ long int
    #define __INT_FAST16_MAX__ 0x7fffffffffffffffL
    #define __INT_FAST16_TYPE__ long int
    #define __INT_FAST32_MAX__ 0x7fffffffffffffffL
    #define __INT_FAST32_TYPE__ long int
    #define __INT_FAST64_MAX__ 0x7fffffffffffffffL
    #define __INT_FAST64_TYPE__ long int
    #define __INT_FAST8_MAX__ 0x7f
    #define __INT_FAST8_TYPE__ signed char
    #define __INT_LEAST16_MAX__ 0x7fff
    #define __INT_LEAST16_TYPE__ short int
    #define __INT_LEAST32_MAX__ 0x7fffffff
    #define __INT_LEAST32_TYPE__ int
    #define __INT_LEAST64_MAX__ 0x7fffffffffffffffL
    #define __INT_LEAST64_TYPE__ long int
    #define __INT_LEAST8_MAX__ 0x7f
    #define __INT_LEAST8_TYPE__ signed char
    #define __INT_MAX__ 0x7fffffff
    #define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
    #define __LDBL_DIG__ 18
    #define __LDBL_EPSILON__ 1.08420217248550443401e-19L
    #define __LDBL_HAS_DENORM__ 1
    #define __LDBL_HAS_INFINITY__ 1
    #define __LDBL_HAS_QUIET_NAN__ 1
    #define __LDBL_MANT_DIG__ 64
    #define __LDBL_MAX_10_EXP__ 4932
    #define __LDBL_MAX_EXP__ 16384
    #define __LDBL_MAX__ 1.18973149535723176502e+4932L
    #define __LDBL_MIN_10_EXP__ (-4931)
    #define __LDBL_MIN_EXP__ (-16381)
    #define __LDBL_MIN__ 3.36210314311209350626e-4932L
    #define __LONG_LONG_MAX__ 0x7fffffffffffffffLL
    #define __LONG_MAX__ 0x7fffffffffffffffL
    #define __LP64__ 1
    #define __MMX__ 1
    #define __NO_INLINE__ 1
    #define __ORDER_BIG_ENDIAN__ 4321
    #define __ORDER_LITTLE_ENDIAN__ 1234
    #define __ORDER_PDP_ENDIAN__ 3412
    #define __PIC__ 2
    #define __PIE__ 2
    #define __PRAGMA_REDEFINE_EXTNAME 1
    #define __PTRDIFF_MAX__ 0x7fffffffffffffffL
    #define __PTRDIFF_TYPE__ long int
    #define __REGISTER_PREFIX__ 
    #define __SCHAR_MAX__ 0x7f
    #define __SEG_FS 1
    #define __SEG_GS 1
    #define __SHRT_MAX__ 0x7fff
    #define __SIG_ATOMIC_MAX__ 0x7fffffff
    #define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1)
    #define __SIG_ATOMIC_TYPE__ int
    #define __SIZEOF_DOUBLE__ 8
    #define __SIZEOF_FLOAT128__ 16
    #define __SIZEOF_FLOAT80__ 16
    #define __SIZEOF_FLOAT__ 4
    #define __SIZEOF_INT128__ 16
    #define __SIZEOF_INT__ 4
    #define __SIZEOF_LONG_DOUBLE__ 16
    #define __SIZEOF_LONG_LONG__ 8
    #define __SIZEOF_LONG__ 8
    #define __SIZEOF_POINTER__ 8
    #define __SIZEOF_PTRDIFF_T__ 8
    #define __SIZEOF_SHORT__ 2
    #define __SIZEOF_SIZE_T__ 8
    #define __SIZEOF_WCHAR_T__ 4
    #define __SIZEOF_WINT_T__ 4
    #define __SIZE_MAX__ 0xffffffffffffffffUL
    #define __SIZE_TYPE__ long unsigned int
    #define __SSE2_MATH__ 1
    #define __SSE2__ 1
    #define __SSE_MATH__ 1
    #define __SSE__ 1
    #define __SSP_STRONG__ 3
    #define __STDC_HOSTED__ 1
    #define __STDC_IEC_559_COMPLEX__ 1
    #define __STDC_IEC_559__ 1
    #define __STDC_ISO_10646__ 201605L
    #define __STDC_NO_THREADS__ 1
    #define __STDC_UTF_16__ 1
    #define __STDC_UTF_32__ 1
    #define __STDC_VERSION__ 201112L
    #define __STDC__ 1
    #define __UINT16_C(c) c
    #define __UINT16_MAX__ 0xffff
    #define __UINT16_TYPE__ short unsigned int
    #define __UINT32_C(c) c ## U
    #define __UINT32_MAX__ 0xffffffffU
    #define __UINT32_TYPE__ unsigned int
    #define __UINT64_C(c) c ## UL
    #define __UINT64_MAX__ 0xffffffffffffffffUL
    #define __UINT64_TYPE__ long unsigned int
    #define __UINT8_C(c) c
    #define __UINT8_MAX__ 0xff
    #define __UINT8_TYPE__ unsigned char
    #define __UINTMAX_C(c) c ## UL
    #define __UINTMAX_MAX__ 0xffffffffffffffffUL
    #define __UINTMAX_TYPE__ long unsigned int
    #define __UINTPTR_MAX__ 0xffffffffffffffffUL
    #define __UINTPTR_TYPE__ long unsigned int
    #define __UINT_FAST16_MAX__ 0xffffffffffffffffUL
    #define __UINT_FAST16_TYPE__ long unsigned int
    #define __UINT_FAST32_MAX__ 0xffffffffffffffffUL
    #define __UINT_FAST32_TYPE__ long unsigned int
    #define __UINT_FAST64_MAX__ 0xffffffffffffffffUL
    #define __UINT_FAST64_TYPE__ long unsigned int
    #define __UINT_FAST8_MAX__ 0xff
    #define __UINT_FAST8_TYPE__ unsigned char
    #define __UINT_LEAST16_MAX__ 0xffff
    #define __UINT_LEAST16_TYPE__ short unsigned int
    #define __UINT_LEAST32_MAX__ 0xffffffffU
    #define __UINT_LEAST32_TYPE__ unsigned int
    #define __UINT_LEAST64_MAX__ 0xffffffffffffffffUL
    #define __UINT_LEAST64_TYPE__ long unsigned int
    #define __UINT_LEAST8_MAX__ 0xff
    #define __UINT_LEAST8_TYPE__ unsigned char
    #define __USER_LABEL_PREFIX__ 
    #define __VERSION__ "6.3.0 20170406"
    #define __WCHAR_MAX__ 0x7fffffff
    #define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1)
    #define __WCHAR_TYPE__ int
    #define __WINT_MAX__ 0xffffffffU
    #define __WINT_MIN__ 0U
    #define __WINT_TYPE__ unsigned int
    #define __amd64 1
    #define __amd64__ 1
    #define __code_model_small__ 1
    #define __gnu_linux__ 1
    #define __has_include(STR) __has_include__(STR)
    #define __has_include_next(STR) __has_include_next__(STR)
    #define __k8 1
    #define __k8__ 1
    #define __linux 1
    #define __linux__ 1
    #define __pic__ 2
    #define __pie__ 2
    #define __unix 1
    #define __unix__ 1
    #define __x86_64 1
    #define __x86_64__ 1
    #define linux 1
    #define unix 1
    
  • 2

    在旧时代(ANSI之前),预定义符号(如 unixvax )是一种允许代码在编译时检测正在编译的系统的方法 . 当时没有官方语言标准(超出第一版K&R背面的参考资料),任何复杂性的C代码通常是 #ifdef s的复杂迷宫,以允许系统之间的差异 . 这些宏定义通常由编译器本身设置,而不是在库头文件中定义 . 由于没有关于实现可以使用哪些标识符以及为程序员保留哪些标识符的实际规则,编译器编写者可以随意使用简单的名称,如 unix ,并假设程序员只是为了自己的目的而避免使用这些名称 .

    1989 ANSI C标准引入了限制实现可以合法预定义的符号的规则 . 编译器预定义的宏只能有一个以两个下划线开头的名称,或者下划线后跟一个大写字母,这样程序员就可以自由地使用与该模式不匹配但未在标准库中使用的标识符 .

    因此,任何预定义 unixlinux 的编译器都是不符合的,因为它无法编译使用 int linux = 5; 之类的完全合法的代码 .

    碰巧的是,默认情况下gcc是不符合的 - 但是它可以与正确的命令行选项一致(合理地):

    gcc -std=c90 -pedantic ... # or -std=c89 or -ansi
    gcc -std=c99 -pedantic
    gcc -std=c11 -pedantic
    

    有关详细信息,请参阅the gcc manual .

    gcc将在未来的版本中逐步淘汰这些定义,所以你不应该为Linux目标编译't write code that depends on them. If your program needs to know whether it'它是否可以检查 __linux__ 是否被定义(假设你're using gcc or a compiler that'与它兼容) . 有关更多信息,请参见the GNU C preprocessor manual .

    一个很大程度上无关紧要的东西:1987年"Best One Liner"的获胜者,David Korn(是的,Korn Shell的作者)利用了预定义的 unix 宏:

    main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
    

    它打印 "unix" ,但原因与宏名称的拼写完全无关 .

  • 899

    info gcc (强调我的):

    -ansi在C模式下,这相当于-std = c90 . 在C模式下,它相当于-std = c 98.这将关闭GCC的某些功能,这些功能与ISO C90(编译C代码时)或标准C(编译C代码时)不兼容,例如asm和typeof关键字和预定义的宏,例如'unix'和'vax',用于标识您正在使用的系统类型 . 它还支持不受欢迎且很少使用的ISO三字符功能 . 对于C编译器,它禁用C样式//注释以及内联关键字的识别 .

    (它在示例中使用 vax 而不是 linux 因为当它被写入时可能它更受欢迎;-) .

    基本思想是,当使用 -ansi 选项调用GCC时,GCC仅尝试完全符合ISO标准 .

  • 175

    因为 linux 是在编译器运行或编译时定义的内置宏(如果它是交叉编译器),Linux .

    有很多这样的预定义宏 . 同GCC,您可以使用:

    cp /dev/null emptyfile.c
    gcc -E -dM emptyfile.c
    

    获取宏列表 . (我没有设法说服GCC直接接受 /dev/null ,但空文件似乎工作正常 . )在Mac OS X 10.8.5上运行GCC 4.8.1,我得到了输出:

    #define __DBL_MIN_EXP__ (-1021)
    #define __UINT_LEAST16_MAX__ 65535
    #define __ATOMIC_ACQUIRE 2
    #define __FLT_MIN__ 1.17549435082228750797e-38F
    #define __UINT_LEAST8_TYPE__ unsigned char
    #define __INTMAX_C(c) c ## L
    #define __CHAR_BIT__ 8
    #define __UINT8_MAX__ 255
    #define __WINT_MAX__ 2147483647
    #define __ORDER_LITTLE_ENDIAN__ 1234
    #define __SIZE_MAX__ 18446744073709551615UL
    #define __WCHAR_MAX__ 2147483647
    #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
    #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
    #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
    #define __DBL_DENORM_MIN__ ((double)4.94065645841246544177e-324L)
    #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
    #define __GCC_ATOMIC_CHAR_LOCK_FREE 2
    #define __FLT_EVAL_METHOD__ 0
    #define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
    #define __x86_64 1
    #define __UINT_FAST64_MAX__ 18446744073709551615ULL
    #define __SIG_ATOMIC_TYPE__ int
    #define __DBL_MIN_10_EXP__ (-307)
    #define __FINITE_MATH_ONLY__ 0
    #define __GNUC_PATCHLEVEL__ 1
    #define __UINT_FAST8_MAX__ 255
    #define __DEC64_MAX_EXP__ 385
    #define __INT8_C(c) c
    #define __UINT_LEAST64_MAX__ 18446744073709551615ULL
    #define __SHRT_MAX__ 32767
    #define __LDBL_MAX__ 1.18973149535723176502e+4932L
    #define __UINT_LEAST8_MAX__ 255
    #define __GCC_ATOMIC_BOOL_LOCK_FREE 2
    #define __APPLE_CC__ 1
    #define __UINTMAX_TYPE__ long unsigned int
    #define __DEC32_EPSILON__ 1E-6DF
    #define __UINT32_MAX__ 4294967295U
    #define __LDBL_MAX_EXP__ 16384
    #define __WINT_MIN__ (-__WINT_MAX__ - 1)
    #define __SCHAR_MAX__ 127
    #define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1)
    #define __INT64_C(c) c ## LL
    #define __DBL_DIG__ 15
    #define __GCC_ATOMIC_POINTER_LOCK_FREE 2
    #define __SIZEOF_INT__ 4
    #define __SIZEOF_POINTER__ 8
    #define __USER_LABEL_PREFIX__ _
    #define __STDC_HOSTED__ 1
    #define __LDBL_HAS_INFINITY__ 1
    #define __FLT_EPSILON__ 1.19209289550781250000e-7F
    #define __LDBL_MIN__ 3.36210314311209350626e-4932L
    #define __DEC32_MAX__ 9.999999E96DF
    #define __strong 
    #define __INT32_MAX__ 2147483647
    #define __SIZEOF_LONG__ 8
    #define __APPLE__ 1
    #define __UINT16_C(c) c
    #define __DECIMAL_DIG__ 21
    #define __LDBL_HAS_QUIET_NAN__ 1
    #define __DYNAMIC__ 1
    #define __GNUC__ 4
    #define __MMX__ 1
    #define __FLT_HAS_DENORM__ 1
    #define __SIZEOF_LONG_DOUBLE__ 16
    #define __BIGGEST_ALIGNMENT__ 16
    #define __DBL_MAX__ ((double)1.79769313486231570815e+308L)
    #define __INT_FAST32_MAX__ 2147483647
    #define __DBL_HAS_INFINITY__ 1
    #define __DEC32_MIN_EXP__ (-94)
    #define __INT_FAST16_TYPE__ short int
    #define __LDBL_HAS_DENORM__ 1
    #define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
    #define __INT_LEAST32_MAX__ 2147483647
    #define __DEC32_MIN__ 1E-95DF
    #define __weak 
    #define __DBL_MAX_EXP__ 1024
    #define __DEC128_EPSILON__ 1E-33DL
    #define __SSE2_MATH__ 1
    #define __ATOMIC_HLE_RELEASE 131072
    #define __PTRDIFF_MAX__ 9223372036854775807L
    #define __amd64 1
    #define __tune_core2__ 1
    #define __ATOMIC_HLE_ACQUIRE 65536
    #define __LONG_LONG_MAX__ 9223372036854775807LL
    #define __SIZEOF_SIZE_T__ 8
    #define __SIZEOF_WINT_T__ 4
    #define __GXX_ABI_VERSION 1002
    #define __FLT_MIN_EXP__ (-125)
    #define __INT_FAST64_TYPE__ long long int
    #define __DBL_MIN__ ((double)2.22507385850720138309e-308L)
    #define __LP64__ 1
    #define __DEC128_MIN__ 1E-6143DL
    #define __REGISTER_PREFIX__ 
    #define __UINT16_MAX__ 65535
    #define __DBL_HAS_DENORM__ 1
    #define __UINT8_TYPE__ unsigned char
    #define __NO_INLINE__ 1
    #define __FLT_MANT_DIG__ 24
    #define __VERSION__ "4.8.1"
    #define __UINT64_C(c) c ## ULL
    #define __GCC_ATOMIC_INT_LOCK_FREE 2
    #define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__
    #define __INT32_C(c) c
    #define __DEC64_EPSILON__ 1E-15DD
    #define __ORDER_PDP_ENDIAN__ 3412
    #define __DEC128_MIN_EXP__ (-6142)
    #define __INT_FAST32_TYPE__ int
    #define __UINT_LEAST16_TYPE__ short unsigned int
    #define __INT16_MAX__ 32767
    #define __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ 1080
    #define __SIZE_TYPE__ long unsigned int
    #define __UINT64_MAX__ 18446744073709551615ULL
    #define __INT8_TYPE__ signed char
    #define __FLT_RADIX__ 2
    #define __INT_LEAST16_TYPE__ short int
    #define __LDBL_EPSILON__ 1.08420217248550443401e-19L
    #define __UINTMAX_C(c) c ## UL
    #define __SSE_MATH__ 1
    #define __k8 1
    #define __SIG_ATOMIC_MAX__ 2147483647
    #define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
    #define __SIZEOF_PTRDIFF_T__ 8
    #define __x86_64__ 1
    #define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF
    #define __INT_FAST16_MAX__ 32767
    #define __UINT_FAST32_MAX__ 4294967295U
    #define __UINT_LEAST64_TYPE__ long long unsigned int
    #define __FLT_HAS_QUIET_NAN__ 1
    #define __FLT_MAX_10_EXP__ 38
    #define __LONG_MAX__ 9223372036854775807L
    #define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL
    #define __FLT_HAS_INFINITY__ 1
    #define __UINT_FAST16_TYPE__ short unsigned int
    #define __DEC64_MAX__ 9.999999999999999E384DD
    #define __CHAR16_TYPE__ short unsigned int
    #define __PRAGMA_REDEFINE_EXTNAME 1
    #define __INT_LEAST16_MAX__ 32767
    #define __DEC64_MANT_DIG__ 16
    #define __INT64_MAX__ 9223372036854775807LL
    #define __UINT_LEAST32_MAX__ 4294967295U
    #define __GCC_ATOMIC_LONG_LOCK_FREE 2
    #define __INT_LEAST64_TYPE__ long long int
    #define __INT16_TYPE__ short int
    #define __INT_LEAST8_TYPE__ signed char
    #define __DEC32_MAX_EXP__ 97
    #define __INT_FAST8_MAX__ 127
    #define __INTPTR_MAX__ 9223372036854775807L
    #define __LITTLE_ENDIAN__ 1
    #define __SSE2__ 1
    #define __LDBL_MANT_DIG__ 64
    #define __CONSTANT_CFSTRINGS__ 1
    #define __DBL_HAS_QUIET_NAN__ 1
    #define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1)
    #define __code_model_small__ 1
    #define __k8__ 1
    #define __INTPTR_TYPE__ long int
    #define __UINT16_TYPE__ short unsigned int
    #define __WCHAR_TYPE__ int
    #define __SIZEOF_FLOAT__ 4
    #define __pic__ 2
    #define __UINTPTR_MAX__ 18446744073709551615UL
    #define __DEC64_MIN_EXP__ (-382)
    #define __INT_FAST64_MAX__ 9223372036854775807LL
    #define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
    #define __FLT_DIG__ 6
    #define __UINT_FAST64_TYPE__ long long unsigned int
    #define __INT_MAX__ 2147483647
    #define __MACH__ 1
    #define __amd64__ 1
    #define __INT64_TYPE__ long long int
    #define __FLT_MAX_EXP__ 128
    #define __ORDER_BIG_ENDIAN__ 4321
    #define __DBL_MANT_DIG__ 53
    #define __INT_LEAST64_MAX__ 9223372036854775807LL
    #define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
    #define __DEC64_MIN__ 1E-383DD
    #define __WINT_TYPE__ int
    #define __UINT_LEAST32_TYPE__ unsigned int
    #define __SIZEOF_SHORT__ 2
    #define __SSE__ 1
    #define __LDBL_MIN_EXP__ (-16381)
    #define __INT_LEAST8_MAX__ 127
    #define __SIZEOF_INT128__ 16
    #define __LDBL_MAX_10_EXP__ 4932
    #define __ATOMIC_RELAXED 0
    #define __DBL_EPSILON__ ((double)2.22044604925031308085e-16L)
    #define _LP64 1
    #define __UINT8_C(c) c
    #define __INT_LEAST32_TYPE__ int
    #define __SIZEOF_WCHAR_T__ 4
    #define __UINT64_TYPE__ long long unsigned int
    #define __INT_FAST8_TYPE__ signed char
    #define __DBL_DECIMAL_DIG__ 17
    #define __FXSR__ 1
    #define __DEC_EVAL_METHOD__ 2
    #define __UINT32_C(c) c ## U
    #define __INTMAX_MAX__ 9223372036854775807L
    #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
    #define __FLT_DENORM_MIN__ 1.40129846432481707092e-45F
    #define __INT8_MAX__ 127
    #define __PIC__ 2
    #define __UINT_FAST32_TYPE__ unsigned int
    #define __CHAR32_TYPE__ unsigned int
    #define __FLT_MAX__ 3.40282346638528859812e+38F
    #define __INT32_TYPE__ int
    #define __SIZEOF_DOUBLE__ 8
    #define __FLT_MIN_10_EXP__ (-37)
    #define __INTMAX_TYPE__ long int
    #define __DEC128_MAX_EXP__ 6145
    #define __ATOMIC_CONSUME 1
    #define __GNUC_MINOR__ 8
    #define __UINTMAX_MAX__ 18446744073709551615UL
    #define __DEC32_MANT_DIG__ 7
    #define __DBL_MAX_10_EXP__ 308
    #define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
    #define __INT16_C(c) c
    #define __STDC__ 1
    #define __PTRDIFF_TYPE__ long int
    #define __ATOMIC_SEQ_CST 5
    #define __UINT32_TYPE__ unsigned int
    #define __UINTPTR_TYPE__ long unsigned int
    #define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD
    #define __DEC128_MANT_DIG__ 34
    #define __LDBL_MIN_10_EXP__ (-4931)
    #define __SIZEOF_LONG_LONG__ 8
    #define __GCC_ATOMIC_LLONG_LOCK_FREE 2
    #define __LDBL_DIG__ 18
    #define __FLT_DECIMAL_DIG__ 9
    #define __UINT_FAST16_MAX__ 65535
    #define __GNUC_GNU_INLINE__ 1
    #define __GCC_ATOMIC_SHORT_LOCK_FREE 2
    #define __SSE3__ 1
    #define __UINT_FAST8_TYPE__ unsigned char
    #define __ATOMIC_ACQ_REL 4
    #define __ATOMIC_RELEASE 3
    

    那是来自空文件的236个宏 . 当我将 #include <stdio.h> 添加到文件中时,定义的宏数达到505.这些宏包括各种平台识别宏 .

相关问题