MacOS Big Sur编译C++出现range-based for loop C++11扩展警告如何默认启用高版本标准
问题现象
在MacOS Big Sur系统编译包含范围for循环的C++代码时,出现如下警告:
warning: range-based for loop is a C++11 extension [-Wc++11-extensions]
该警告在使用clang和g编译时都会出现,需求为设置编译器默认使用C++11及以上标准,无需每次手动添加-std=c++11参数,且不使用别名方案。
解决方案
方案1:配置全局编译器环境变量
编译器原生支持读取CXXFLAGS环境变量作为默认编译参数,该方案不属于别名配置:
- 若使用zsh(MacOS Catalina及之后版本默认shell),编辑
~/.zshrc文件;若使用bash,编辑~/.bash_profile或~/.bashrc文件 - 在文件末尾添加如下内容,可根据需求替换为
c++11、c++17或c++20等你需要的标准版本:
export CXXFLAGS="$CXXFLAGS -std=c++17" export CFLAGS="$CFLAGS -std=c17"
注意MacOS系统默认的g++实际是clang的软链接,配置上述环境变量后clang和g都会生效
- 保存退出后执行对应命令生效:
- zsh环境执行:
source ~/.zshrc - bash环境执行:
source ~/.bash_profile
- zsh环境执行:
方案2:升级Xcode命令行工具
Big Sur支持的最新版Xcode命令行工具自带的clang默认启用C++17标准,无需额外配置即可解决警告:
- 执行命令安装最新官方命令行工具:
xcode-select --install - 安装完成后执行
clang++ --version确认版本,13.0及以上版本默认不再使用C++98作为默认标准。
验证方法
编写测试代码保存为test.cpp:
#include <iostream> #include <vector> int main() { std::vector<int> arr = {1,2,3,4}; for (auto num : arr) { std::cout << num << " "; } return 0; }
直接执行clang++ test.cpp或g++ test.cpp,不会再出现题目中的警告,运行生成的a.out可正常输出结果。
内容的提问来源于stack exchange,提问作者kkadhith
相关产品推荐
相关产品推荐

