C11可选功能宏在哪里?

C11可选功能宏在哪里?,c,C,在C11标准中,编译器应该提供一些宏来测试可选功能的存在。在什么标题中可以找到它们 例如,位于哪里 对于GCC,也就是说,如果我试图在COMPLEX.h中查找\uu STDC\u NO\u COMPLEX\uu,我在那里找不到它…它们没有在任何头中定义,编译器将自己定义它们 您可以转储所有预处理器定义。例如,对于gcc编写: gcc -dM -E - < /dev/null 或 如果定义了STDC\u NO\u复合体,则表示没有复合体。h STDC\u NO\u COMPLEX由编译器定

在C11标准中,编译器应该提供一些宏来测试可选功能的存在。在什么标题中可以找到它们

例如,位于哪里


对于GCC,也就是说,如果我试图在
COMPLEX.h中查找
\uu STDC\u NO\u COMPLEX\uu
,我在那里找不到它…

它们没有在任何头中定义,编译器将自己定义它们

您可以转储所有预处理器定义。例如,对于gcc编写:

gcc -dM -E - < /dev/null


如果定义了STDC\u NO\u复合体,则表示没有复合体。h

STDC\u NO\u COMPLEX由编译器定义,而不是由头文件定义


来源:

测试不是宏的值,而是宏是否定义。它们是由预处理器预先定义的(如果有的话)。所以不需要包含任何内容。我如何在我的代码中使用#ifdef指令测试它呢?我已经在我的答案中添加了〈code〉ifdef〈code〉进行测试。具有讽刺意味的是,C11标准附录B说STDC#u no#u复合体应该位于COMPLEX.h中,这没有任何意义。似乎是(非规范性)附录B中的错误。
bob@bob-fedora:~/trunk/software$ gcc --version
gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8)
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

bob@bob-fedora:~/trunk/software$ gcc -std=gnu11 -dM -E - < /dev/null | grep STDC
#define __STDC_HOSTED__ 1
#define __STDC_UTF_16__ 1
#define __STDC_VERSION__ 201112L
#define __GNUC_STDC_INLINE__ 1
#define __STDC_UTF_32__ 1
#define __STDC__ 1
#ifdef __STDC_NO_VLA__
#error Your compiler does not support VLAs! Please use a supported compiler.
#endif
#ifndef __STDC_NO_VLA__
// code using variable length arrays
#else
// fallback code for when they are not supported
#endif