macOS下VS Code编译C++自动添加-std=gnu++14如何移除?
macOS下VS Code编译C++17自动添加
-std=gnu++14的问题 问题详情
我是macOS系统上的VS Code初学者,尝试使用C++17的结构化绑定语法:
for (auto [document_id, relevance] : documents) { cout << "{ document_id = "s << document_id << ", relevance = "s << relevance << " }"s << endl; }
执行「终端→运行构建任务」时,编译参数里自动在我指定的-std=gnu++17前加上了-std=gnu++14,即使已经在tasks.json里配置了-std=gnu++17。
我的tasks.json配置:
{ "version": "2.0.0", "tasks": [ { "type": "cppbuild", "label": "C/C++: clang++", "command": "/usr/bin/clang++", "args": [ "-std=gnu++17", "-stdlib=libc++", "-fcolor-diagnostics", "-fansi-escape-codes", "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "/usr/bin/clang++" } ] }
构建输出:
* Executing task: C/C++: clang++ Starting build... /usr/bin/clang++ -std=gnu++14 -std=gnu++17 -stdlib=libc++ -fcolor-diagnostics -fansi-escape-codes -g /Users/user/Documents/С++/000test/main.cpp -o /Users/user/Documents/С++/000test/main Build finished successfully. * Terminal will be reused by tasks, press any key to close it.
问题原因
VS Code的C/C扩展(ms-vscode.cpptools)会自动注入编译参数,-std=gnu++14是扩展默认添加的C标准参数,它会优先插入到你在tasks.json中指定的参数列表前面。
解决方法
方法1:修正C/C++扩展的全局配置
- 按下快捷键
Cmd+,打开VS Code设置界面 - 在搜索框输入
C_Cpp: Cpp Standard,将选项设置为gnu++17(匹配你需要的带GNU扩展的C++17标准) - 再搜索
C_Cpp: Compiler Args,如果列表中存在-std=gnu++14,直接删除该条目
这样扩展就会自动注入正确的标准参数,不会再添加-std=gnu++14。
方法2:修改tasks.json强制覆盖
如果方法1无效,可以在tasks.json的任务配置中添加"overrideArgs": true,让自定义参数完全覆盖扩展自动注入的参数:
{ "version": "2.0.0", "tasks": [ { "type": "cppbuild", "label": "C/C++: clang++", "command": "/usr/bin/clang++", "args": [ "-std=gnu++17", "-stdlib=libc++", "-fcolor-diagnostics", "-fansi-escape-codes", "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "/usr/bin/clang++", "overrideArgs": true // 添加这一行 } ] }
关于参数覆盖的疑问
是的,clang编译器会以后续出现的-std参数为准。输出中虽然-std=gnu++14在前,但后面的-std=gnu++17会完全覆盖前者的设置,这也是你的代码能正常编译无警告的原因。
内容的提问来源于stack exchange,提问作者Dany
相关产品推荐
相关产品推荐

