gcc默认的c语言标准是,当前GCC的默认C -std标准版本是什么(尤其是在Ubuntu上)?

GCC的默认C语言标准在不同版本间有所变化。例如,Ubuntu 4.7.2上的cc默认等效于-std=gnu90,即1990标准加上GNU扩展。到了GCC 5.4.0,C语言的默认标准变为-std=gnu11。在更现代的GCC版本中,如6.3.1到7.3.1,C语言的默认标准依然为-std=gnu11,而C++从-std=gnu++98升级到-std=gnu++14。通过-std参数,开发者可以明确指定C/C++的合规标准。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

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

次佳回答

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

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:

__STDC_VERSION__:为每个版本设置的C99 + ANSI C宏。在标准中尚未定义的C89中不存在。

C++

main.cpp

#include

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。

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值