我开始将我的C知识从C99升级到C11,我想知道我的编译器在默认情况下是否能够理解C11,或者我需要-std=c11
标志;我如何用不使用-std=c99
标志编译的简单c11源代码来测试它呢?还有C++11标准,但我从这篇文章开始,这只是关于C的。
我尝试使用一些使用auto
声明的简单代码,但是由于它是一个有效的关键字(在C99中也是一个有效的关键字),所以我有点不知所措,在这里询问。
在发布这个问题之后,我收到了有关宏__STDC__VERSION__
的答案,并尝试了这个答案的代码。
令人惊讶的是,我的测试结果是:
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中可用。
发布于 2016-06-15 09:37:48
GCC从4.x开始添加C11支持。他们逐渐增加了越来越多的C11支持。但是所有4.x版本都默认为-std=gnu90
。
GCC从5.0及更高版本应该默认为-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
发布于 2016-06-15 09:37:01
__STDC_VERSION__
是用C11的值201112L
定义的。C99以199901L
作为值。
这将是最可靠的方法。
请注意,这个值将在未来的标准中发生变化,并且(Creding@Lundin),未来的版本号在时间上单调地增加。
https://stackoverflow.com/questions/37831399
复制相似问题