问题描述
当我要求查看cc的当前版本时,我得到了。
$ cc --version
cc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
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.
$
我想知道的是使用的是c89,c90,c99或c11。
最佳回答
在gcc手册(如果已安装)中,通过键入info gcc
或在线here对其进行了详细说明。 4.7.2手册的相关部分为here。
默认情况下,gcc不符合任何ANSI /ISO C标准。当前默认值等效于-std=gnu90
,这是1989/1990标准,扩展名为GNU-specific。 (未发布语言标准要求的某些诊断。)2015年4月22日发布的5.1.0版将默认值从-std=gnu90
更改为-std=gnu11
,as documented here。
如果要实现标准一致性,可以使用以下任意一种:
-std=c90 -pedantic
-std=c99 -pedantic
-std=c11 -pedantic
-std=c90
也可以拼写为-ansi
,-std=c89
或-std=iso9899:1990
。
-std=iso9899:199409
支持C90标准以及1995年修订版,该修订版增加了一些次要功能(所有功能也在C99中)。
-std=c99
也可以拼写为-std=c9x
或-std=iso9899:1999
(在发布标准之前使用名称c9x
)。 C99支持为not quite complete,但是已经关闭。
-std=c11
也可以拼写为-std=c0x
或-std=iso9899:2011
(在发布最终标准之前使用名称c0x
;错误地认为x
不会超过9)。 C11支持也不完整;当前状态为summarized here。
-pedantic
选项使gcc打印出违反约束和语法规则的诊断信息。在某些情况下,这些诊断仅仅是警告-并没有容易的方法来区分这些警告和该语言不需要的其他警告。将-pedantic
替换为-pedantic-errors
,以使gcc将违反语言的行为视为致命错误。
标准的简要历史:
-
C89是ANSI在1989年发布的第一个官方C标准。
-
C90是标准的ISO版本,描述的语言与C89完全相同。 ANSI正式采用了该标准的ISO版本。有两个技术勘误,更正了一些错误。
-
C95是对C90的修订,增加了一些功能,主要是字母组合和广泛的字符支持。据我所知,从未发布过合并版本。
-
C99由ISO于1999年发布。共有三个技术勘误。
-
C11由ISO于2011年发布。存在一项技术勘误,修正了
__STDC_VERSION__
和__STDC_LIB_EXT1__
的定义。
ANSI没有发布自己的版本的1999或2011标准,而是采用了ISO标准。
N1256是C99标准的免费提供的草案,其中已合并了3个技术勘误。
N1570是C11标准的免费提供的草案。它与已发布的C11标准之间存在一些细微的差异,另外还有一项技术勘误。有关更多详细信息,请参见my answer至this question。
次佳回答
对于gcc6,来自info gcc
的有用信息;对于gcc5,来自https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Standards.html#Standards的有用信息
gcc版本6.3.1
–7.3.1
2.1 C Language
==============
The default, if no C language dialect options are given, is
'-std=gnu11'.
2.2 C++ Language
================
The default, if no C++ language dialect options are given, is
'-std=gnu++14'.
gcc版本5.4.0
2.1 C Language
==============
The default, if no C language dialect options are given, is -std=gnu11
2.2 C++ Language
================
The default, if no C++ language dialect options are given, is -std=gnu++98
对于C,默认模式仍为std = gnu11,但对于C++,它已从std = gnu ++ 98跳至std = gnu ++ 14
第三种回答
最少的测试程序
如果您想凭经验找到它而无需阅读任何手册。
抄送
#include <stdio.h>
int main(void) {
#ifdef __STDC_VERSION__
printf("__STDC_VERSION__ = %ld \n", __STDC_VERSION__);
#endif
#ifdef __STRICT_ANSI__
puts("__STRICT_ANSI__");
#endif
return 0;
}
测试:
#!/usr/bin/env bash
for std in c89 c99 c11 c17 gnu89 gnu99 gnu11 gnu17; do
echo $std
gcc -std=$std -o c.out c.c
./c.out
echo
done
echo default
gcc -o c.out c.c
./c.out
结果:
c89
__STRICT_ANSI__
c99
__STDC_VERSION__ = 199901
__STRICT_ANSI__
c11
__STDC_VERSION__ = 201112
__STRICT_ANSI__
c17
__STDC_VERSION__ = 201710
__STRICT_ANSI__
gnu89
gnu99
__STDC_VERSION__ = 199901
gnu11
__STDC_VERSION__ = 201112
gnu17
__STDC_VERSION__ = 201710
default
__STDC_VERSION__ = 201710
结论:默认情况下使用gnu17
:
-
__STRICT_ANSI__
:为-std=c
定义但未为-std=gnu
定义的GCC扩展名,请参阅:https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html -
__STDC_VERSION__
:为每个版本设置的C99 + ANSI C宏。在标准中尚未定义的C89中不存在。
C++
main.cpp
#include <iostream>
int main(void) {
#ifdef __cplusplus
std::cout << __cplusplus << std::endl;
#endif
#ifdef __STRICT_ANSI__
std::cout << "__STRICT_ANSI__" << std::endl;
#endif
return 0;
}
测试:
#!/usr/bin/env bash
for std in c++98 c++11 c++14 c++17 gnu++98 gnu++11 gnu++14 gnu++17; do
echo $std
g++ -std=$std -o cpp.out cpp.cpp
./cpp.out
echo
done
echo default
g++ -o cpp.out cpp.cpp
./cpp.out
结果:
c++98
199711
__STRICT_ANSI__
c++11
201103
__STRICT_ANSI__
c++14
201402
__STRICT_ANSI__
c++17
201703
__STRICT_ANSI__
gnu++98
199711
gnu++11
201103
gnu++14
201402
gnu++17
201703
default
201402
结论:gnu++14
是默认值:
-
__cplusplus
:由C++标准定义的宏,包括C++ 98起
在Ubuntu 18.10,GCC 8.2.0上进行了测试。 GitHub upstream。
第四种回答
第一行将提供您的GCC版本(4.7.2)
(Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
编译代码时,可以通过添加-std=c99
或-std=c99
来指定要使用的C /C++版本。
注意默认情况下使用gnu89
。