最小的c11源代码

时间:2016-06-15 09:27:21

标签: c11

我开始将我的C知识从C99升级到C11,我想知道我的编译器是否能够默认理解C11或者我需要-std=c11标志;如何使用不使用-std=c99标志编译的简单c11源代码来测试它?还有C ++ 11标准,但我从this article开始,它只是关于C.

我使用auto声明尝试了一些简单的代码,但由于它在C99中也是一个有效的关键字,我有点迷失并在这里问。

发布此问题后,我收到了有关宏__STDC__VERSION__的答案,并尝试了this answer的代码。

令人惊讶,我的测试结果是:

compile line: gcc main.c -std=c11 -o main.exe
oputput of main.exe: c11

compile line: gcc main.c -std=c99 -o main.exe
oputput of main.exe: c99

compile line: gcc main.c -o main.exe
oputput of main.exe: gnu90

情况是我可以在运行时获得编译器功能,但在编译时仍然没有。

对于C ++,我能够找到仅使用C ++ 11编译的示例代码:

int main()
{
    int *p = nullptr;
}

由于nullptr仅在C ++ 11中可用。

2 个答案:

答案 0 :(得分:2)

来自4.x的GCC开始添加C11支持。他们逐渐增加了越来越多的C11支持。但所有4.x版本默认为-std=gnu90

5.0及更高版本的GCC默认为-std=gnu11,并且会理解C11。因此,为了了解您的gcc默认值,只需查看gcc --version

请注意,这与标准C不同。如果您需要纯标准C,则必须始终使用-std=c11 -pedantic-errors。我强烈建议总是使用这两个开关,特别是在学习C时。

以编程方式,您可以检查编译器设置的版本是这样的:

#if __STDC_VERSION__ == 201112L
  #error C11 compiler
#if __STDC_VERSION__ == 199901L
  #error C99 compiler
#else    
  #error Sucky compiler
#endif

答案 1 :(得分:0)

对于C11,

pid定义为值__STDC_VERSION__。 C99的值为201112L

这将是最可靠的方式。

请注意,此值将在未来的标准中更改并且(记入@Lundin),未来版本号会及时单调增加。