C11可选功能宏在哪里?

时间:2014-04-07 13:40:22

标签: c

在C11标准中写道,编译器应提供一些宏来测试可选功能的存在。我在哪个标题中找到它们?

例如位于__STDC_NO_VLA__的位置?

使用GCC,即如果我尝试在__STDC_NO_COMPLEX__中找到complex.h,我在那里找不到...

2 个答案:

答案 0 :(得分:6)

它们没有在任何标题中定义,编译器会自己定义它们。

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

gcc -dM -E - < /dev/null

例如对我来说:

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

在您给出的示例中,__STDC_NO_VLA__存在这意味着编译器不支持可变长度数组。你可以写:

#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

答案 1 :(得分:1)

如果定义了 STDC_NO_COMPLEX ,则表示没有complex.h。

STDC_NO_COMPLEX 由编译器定义,而不是由头文件定义

来源:http://en.cppreference.com/w/c/numeric/complex