如何适配g++编译器至对应C++标准?及g++7.2.0支持标准查询
C标准与编译器版本的关系,以及g7.2.0的配置指南
一、关于C++标准和版本的表述确认
你的说法完全正确!
- C本身没有“版本”的概念,它是由国际标准化组织(ISO)发布的编程语言规范标准,比如我们常说的C11、C14、C17、C++20等,这些都是不同年份发布的标准版本号,用来定义语言的语法、特性和行为规范。
- 而C编译器(比如g、Clang、MSVC等)才有自己的版本划分(比如g7.2.0、Clang 16等),每个编译器版本会针对不同的C标准提供不同程度的支持——有的标准可能完全实现,有的可能只支持部分特性,还有的可能需要通过实验性选项开启。
二、g7.2.0支持的C标准
g7.2.0是2017年发布的版本,对各C标准的支持情况如下:
- C++98/03:完全支持,这是早期g++版本默认的旧标准(如果不指定标准,编译器会默认使用这个)
- C++11:完全支持,从g4.8.x开始就已经实现了C11的绝大多数特性,到7.2.0已经是完整支持状态
- C++14:完全支持,g从5.x版本开始就完整支持C14
- C++17:部分支持,这是当时刚正式发布的新标准,g++7.2.0已经实现了大部分核心特性,但还有一些边缘特性(比如部分并行算法、某些constexpr扩展等)没有完全落地,部分特性可能需要额外编译选项
- C++20:几乎不支持,仅包含极少数实验性的早期特性,不建议在这个版本编译器中尝试使用C++20
三、在原生Makefile中配置g7.2.0适配对应C标准
要让g按照指定的C标准编译,只需要在Makefile的CXXFLAGS(C++编译选项)中添加-std=<标准标识>即可,常见的标识有两种:
-std=c++xx:严格遵循对应的C++标准,禁用所有GNU扩展特性-std=gnu++xx:默认模式,在遵循标准的同时保留GNU特有的扩展(比如内置函数、语法扩展等,大多数场景下推荐用这个)
示例Makefile
# 指定使用g++7.2.0作为编译器(如果系统中有多个g++版本,可能需要写全路径,比如/usr/local/bin/g++-7) CXX = g++ # 配置编译选项:指定C++14标准,同时开启基础警告和优化 CXXFLAGS += -std=gnu++14 -Wall -Wextra -O2 # 最终生成的可执行文件名称 TARGET = my_cpp_program # 项目的源文件列表 SRCS = main.cpp helper.cpp data_process.cpp # 默认构建目标 all: $(TARGET) # 编译规则:将所有源文件编译链接成目标程序 $(TARGET): $(SRCS) $(CXX) $(CXXFLAGS) -o $@ $^ # 清理生成的文件 clean: rm -f $(TARGET)
对应不同标准的编译选项
如果要切换到其他标准,只需要修改CXXFLAGS中的-std参数:
- 适配C++11:
-std=gnu++11或-std=c++11 - 适配C++14:
-std=gnu++14或-std=c++14 - 适配C17:
-std=gnu++17或-std=c++17(注意g7.2.0对C++17的支持是部分的,编译时可能会遇到某些特性未实现的报错)
内容的提问来源于stack exchange,提问作者bgarcial
相关产品推荐
相关产品推荐

