You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用clang++编译C++文件时省略-std=c++17无法识别花括号声明问题咨询

问题原因

花括号列表初始化(也叫统一初始化)语法虽然在C11版本就已首次引入,但C11、C14两个早期标准对这一语法的使用限制较多,很多简化写法直到C17版本才正式纳入标准支持:比如聚合类的拷贝列表初始化、自定义类的隐式模板参数推导、无类型的返回值列表初始化等场景,在老标准下直接用花括号初始化都会触发语法错误。
Clang编译器默认使用的编译标准为C14或更早的GNU扩展C标准,不加-std=c++17参数时自然无法识别C++17新增的合法花括号初始化写法。

解决方法

你可以根据自己的使用场景二选一:

  • 方案1:固定使用C17及更高版本标准编译
    这是改造成本最低的方案,你当前使用的编译命令clang++ -std=c++17 main.cpp address.cpp city.cpp -o main完全正确,也可以根据需求替换为-std=c++20、-std=c++23等更高版本的标准参数,均可兼容C
    17的语法特性。如果不想每次手动输入参数,可以编写Makefile或在IDE的编译配置里默认添加-std=c++17参数即可。
  • 方案2:修改代码兼容C++14及更早标准
    如果你的部署环境要求必须使用旧标准编译,可以按照以下规则调整代码:
    • 聚合类(无自定义构造函数、所有成员均为public的类/结构体)的花括号初始化如果报错,替换为对应参数的小括号构造写法,或显式声明变量类型
    • 用到类模板参数推导的场景,显式写出完整模板参数
    • 函数返回值使用花括号初始化的位置,改为先显式构造对象再返回

内容的提问来源于stack exchange,提问作者felix.osch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:15:03