C++使用{}初始化变量报错,VSCode CodeRunner运行失败但终端正常
问题根因判定
该问题和 clang 11 编译器本身无关,问题完全出在 VS Code CodeRunner 扩展的默认编译配置上:
- 你用到的
{}列表初始化是 C++11 才正式引入的语法特性,clang 11 原生完全支持该特性,你在终端可以正常运行编译后的程序,已经验证了编译器本身不存在兼容性问题。 - CodeRunner 扩展调用 clang 编译 C++ 代码时默认没有指定 C++ 标准版本,会 fallback 到旧的 C++98 标准执行编译,该版本不识别
{}初始化语法,就会抛出error: expected ';' at end of declaration的错误提示。 - 终端能正常运行是因为你之前在终端编译代码时,要么手动指定了高于等于 C11 的标准,要么终端环境的默认编译配置已经绑定了高版本 C 标准,而 CodeRunner 会使用独立的编译命令,不会继承终端的环境配置,也不会复用你之前在终端生成的编译产物。
修复方案
你只需要修改 CodeRunner 的 C++ 编译命令,显式指定 C++ 标准即可:
- 打开 VS Code 设置,搜索
code-runner.executorMap,点击「在settings.json中编辑」 - 在配置项中找到cpp对应的编译规则,默认值大致如下:
"cpp": "clang $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt" - 在编译参数中添加指定C++标准的参数,修改后的示例如下:
"cpp": "clang++ -std=c++17 $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"你可以根据自己的开发需求,将
-std=c++17替换为-std=c++11/-std=c++14/-std=c++20,只要版本不低于 C++11 即可。 - 保存settings.json配置后重新运行代码,即可正常使用
{}初始化语法。
内容的提问来源于stack exchange,提问作者negar pourmoazemi
相关产品推荐
相关产品推荐

