GCC 5.1前默认编译器是C90?如何知道当前编译器默认C/C++标准是多少?如何获取编译器的版本号?

GCC 5.1前默认编译器是C90?

大家会疑惑,GCC 5.1是2015年发布,C99和C11都发布多年,GCC为什么不跟上步伐,将默认编译器设置为C99或C11? 因为GCC扩展了C90,包含了一些C99 feature,这些已经满足当时的需求,因为不是所有的C99都和C90般配,C99增加了不少程序员很少使用的features.
详情参考:C Dialect Options - Using the GNU Compiler Collection (GCC)

如何知道当前编译器默认C/C++标准是多少?

GCC

  • 参考gcc官方网站和发行说明信息,搜索”default for C code“或”default for C++ code“.
  • man gcc搜索"default for C code"或"default for C++ code".
  • 利用-dM -E参数获取
    g++ -dM -E -x c++ /dev/null | grep -F __cplusplus
    - g++ 11.4.0输出的结果#define __cplusplus 201703L,代表默认C++17.
    gcc -dM -E -x c /dev/null | grep -F STDC_VERSION
    - gcc 11.4.0输出的结果define STDC_VERSION 201710L,即代表默认C17.
    - 也可加入-std=xxx选项来检测:gcc -dM -E -x c -std=c11 /dev/null | grep -F STDC_VERSION会得到201112L.

代码中,可以用__STDC_VERSION__宏(C99之前不支持)和__cplusplus宏判断编译器支持的C标准和C++标准版本。

  • C99标准的值为199901L,C11标准的值为201112L,C17标准的值为201710L.
  • C++98标准的值为199711L,C++11标准的值为201103L,C++14标准的值为201402L,C++17标准的值为201703L,C++20标准的值为202002L.

如何获取预处理器定义了哪些宏?

如何获取编译器的版本号?

C语言标准规定了不同版本的代号,但编译器自身的版本和C标准版本不是一个概念,C标准也不会为编译器规定版本号,这是厂商决定的。虽然通过命令行--version选项或者cl /?可以获取版本号,这不能在代码中判断,如下介绍一些编译器定义的版本宏。

  • MSVC
    _MSC_VER宏
  • GCC/MinGW/Cygwin
    __GNUC__: 主版本号。
    __GNUC_MINOR__: 次版本号。
    __GNUC_PATCHLEVEL__: 补丁级别。
  • clang
    __clang_major__: 主版本号。
    __clang_minor__: 次版本号。
    __clang_patchlevel__: 补丁级别。

CMake中可利用CMAKE_CXX_COMPILER_VERSION变量获取编译器版本。


若文章对您有帮助,欢迎关注。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值