当前gcc的默认C模式是什么(特别是在Ubuntu上)?

ncm*_*ist 51 c ubuntu gcc c99 c11

当我要求查看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.

$ 
Run Code Online (Sandbox Code Playgroud)

我想知道的是使用c89,c90,c99或c11中的哪一个.

Kei*_*son 62

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

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

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

-std=c90 -pedantic
-std=c99 -pedantic
-std=c11 -pedantic
Run Code Online (Sandbox Code Playgroud)

-std=c90也可以拼写-ansi,-std=c89-std=iso9899:1990.

-std=iso9899:199409 支持C90标准加上1995年的修正案,增加了一些小功能(所有这些都在C99中).

-std=c99也可以拼写-std=c9x-std=iso9899:1999(名称c9x在标准发布之前使用).C99支持不是很完整,但它很接近.

-std=c11也可以拼写-std=c0x-std=iso9899:2011(在c0x最终标准出版之前使用该名称;错误地认为该名称x不会超过9).C11的支持也不完整; 此处总结了当前状态.

-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标准之间存在一些细微差别,加上一项技术勘误.有关详细信息,请参阅我的回答这个问题.

  • 关于N1570和C11之间的差异,请参阅http://stackoverflow.com/q/8631228/95580.没有区别:他们甚至忘记更新`__STDC_VERSION__`和`__STDC_LIB_EXT1__`!(这在Cor 1:2012中已得到修复;请参阅[stackoverflow.com/q/13914050/95580 ](http://stackoverflow.com/q/13914050/95580).) (3认同)

Var*_*arg 18

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

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'.
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

对于C,默认模式仍为std = gnu11,但对于C++,它已从std = gnu ++ 98跳到std = gnu ++ 14

  • 这回答了这个问题. (3认同)

Cir*_*四事件 7

最少的测试程序

如果您想凭经验找到它而无需阅读任何手册。

抄送

#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;
}
Run Code Online (Sandbox Code Playgroud)

测试:

#!/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
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

结论:gnu17默认情况下使用:

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;
}
Run Code Online (Sandbox Code Playgroud)

测试:

#!/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
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

结论:gnu++14是默认值:

  • __cplusplus:由C ++标准定义的宏,包括C ++ 98起

在Ubuntu 18.10,GCC 8.2.0上进行了测试。GitHub上游