c++oding="utf-8" ?>
Clang默认按C++98解析代码,必须显式加-std=(如-std=c++17)才能启用新特性;CMake中设CMAKE_CXX_STANDARD更稳妥,且应配REQUIRED ON和EXTENSIONS OFF确保严格合规。

clang++ 命令行里必须加 -std= 才生效
Clang 不会默认启用任何 C++ 新标准——哪怕你装的是 clang-18,默认仍按 C++98 行为解析代码。不显式指定,auto、constexpr、结构化绑定这些语法全会报错。
常见写法:
clang++ -std=c++17 main.cpp -o main-
clang++ -std=c++20 -stdlib=libc++ main.cpp -o main(macOS/Linux 推荐显式加-stdlib=libc++) - Windows 上用
clang-cl时,对应参数是/std:c++17,不是-std=
注意:-std=gnu++17 和 -std=c++17 有区别:前者允许 GNU 扩展(如 __attribute__),后者更严格、更可移植。CI 或跨平台项目建议优先用 c++xx 而非 gnu++xx。
CMake 里设 CMAKE_CXX_STANDARD 是最稳妥的做法
直接改命令行容易漏,尤其多人协作或生成多目标时。CMake 提供了统一入口,且会自动把标准透传给所有源文件。
在 CMakeLists.txt 开头附近加上:
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF)
说明:
-
CMAKE_CXX_STANDARD_REQUIRED ON:强制要求编译器支持该标准,不支持就报错,避免静默降级 -
CMAKE_CXX_EXTENSIONS OFF:禁用编译器扩展,等效于用-std=c++17而非-std=gnu++17 - 这个设置只影响 C++ 源文件;C 文件需单独设
CMAKE_C_STANDARD
IDE 或构建系统里别漏掉 per-file 覆盖配置
有些项目混用 C 和 C++,或者部分旧模块必须用 C++11,而新模块要用 C++20。这时全局设置不够用。
例如在 Keil MDK 中:
- 右键某个
.cpp文件 → “Options for File” → C/C++ 标签页 → 在 “Misc Controls” 里填--std=c++20 - 务必确认该文件后缀是
.cpp(不是.c),否则即使写了--std=c++20,armclang 也会当 C 代码处理,直接报错“invalid argument '-std=c++20' not allowed with 'C'”
Dev-C++、VS Code 的 c_cpp_properties.json 也类似:不同文件夹或文件可配不同 "cppStandard",但路径匹配逻辑容易写错,建议先用简单路径测试。
libc++ 和 libstdc++ 的选择会影响可用特性
Clang 默认在 macOS 用 libc++,Linux 用 libstdc++(GCC 自带)。但如果你手动指定 -stdlib=libc++,就得确认对应版本是否支持你要的 C++ 特性。
比如:
- HarmonyOS NEXT Developer Preview0 用的是
libc++from clang/llvm 15.0.4,std::span可用,但std::ranges::filter_view可能还不完整 - Ubuntu 22.04 自带的
libstdc++来自 GCC 11,对 C++20 支持有限;此时即使 clang 命令加了-std=c++20,链接阶段也可能失败
查支持情况最直接的方式是看头文件是否存在、以及 __cpp_lib_* 宏是否定义,而不是只信编译器版本号。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











