67

当我要求查看 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 中的哪一个。

4

6 回答 6

88

这在 gcc 手册中有详细解释,可通过在此处info gcc键入或在线获取(如果已安装) 。4.7.2 手册的相关部分在这里

默认情况下,gcc 不符合任何 ANSI/ISO C 标准。当前默认值等同于-std=gnu90,它是 1989/1990 标准,具有特定于 GNU 的扩展。(未发布语言标准要求的某些诊断。) 2015-04-22 发布的版本 5.1.0 将默认值从 更改-std=gnu90-std=gnu11如此处所述。

如果您想要标准一致性,您可以使用以下任何一种:

-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=c9xor -std=iso9899:1999(该名称c9x在标准发布之前使用)。C99 支持还不是很完整,但已经很接近了。

-std=c11也可以拼写为-std=c0xor -std=iso9899:2011(该名称c0x在最终标准发布之前使用;错误地认为x不会超过 9)。C11 支持也不完整;目前的状态总结在这里

-pedantic选项使 gcc 打印违反约束和语法规则所需的诊断信息。在某些情况下,这些诊断只是警告——并且没有简单的方法来区分这些警告和语言不需要的其他警告。替换-pedantic-pedantic-errors使 gcc 将语言冲突视为致命错误。

标准的快速历史:

  • C89 是第一个官方 C 标准,由ANSI于 1989 年发布。
  • C90 是标准的ISO版本,描述的语言与 C89 完全相同。ANSI 正式采用了 ISO 版本的标准。有两个技术更正,纠正了一些错误。
  • C95 是对 C90 的修正,增加了一些特性,主要是二合字母和宽字符支持。据我所知,从未发布过合并版本。
  • C99 于 1999 年由 ISO 发布。共有三份技术勘误。
  • C11 由 ISO 于 2011 年发布。有一个技术勘误,修正了__STDC_VERSION__和的定义__STDC_LIB_EXT1__

ANSI 没有发布自己的 1999 或 2011 标准版本,而是采用 ISO 标准。

N1256是 C99 标准的免费草案,其中合并了 3 个技术勘误。

N1570是免费提供的 C11 标准草案。它与已发布的 C11 标准以及一份技术勘误之间存在一些细微差别。有关更多详细信息,请参阅对此问题的回答。

于 2013-02-06T19:57:23.173 回答
28

info gcc来自gcc6 和https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Standards.html#Standards for gcc5的有用信息

gcc 版本6.3.1-10.1.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++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++98std=gnu++14

于 2017-05-18T20:28:03.873 回答
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默认使用:

有关-std=gnu*vs的解释,-std=c*另请参见:-std=c++11 和 -std=gnu++11 之间有什么区别?

C++

主文件

#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 上游.

于 2018-10-30T11:48:25.080 回答
3

第一行将给出您的 GCC 版本(4.7.2)

(Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2

编译代码时,您可以指定要使用的 C/C++ 版本,方法是添加-std=c99-std=c99 ...

默认情况下使用注释gnu89

于 2013-02-06T19:27:34.707 回答
0

需要注意的一件事是,gcc 的 -std= 选项不能用于将编译器“沙箱化”为不支持来自标准 C 更高版本的构造。无论有没有,这都是正确的-pedantic

如果您尝试使用某些 C99 代码结构进行编译,则不能依赖于gcc -std=c89 -pedantic给您错误或警告。在某些情况下会,在其他情况下不会。例如,它会愉快地编译%zu在 printf() 调用中使用格式说明符的代码,即使它直到 C99 才被添加。

于 2013-03-12T10:14:54.290 回答
-2

默认 gcc 命令是 ISO C90 的 GNU 方言(包括一些 C99 功能)。这是 C 代码的默认设置。

于 2016-03-10T07:03:05.333 回答