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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。