c++oding="utf-8" ?>
clang编译c++20代码必须显式指定-std=c++20,否则按c++17或更低标准处理;启用模块还需-fmodules等额外标志,且需匹配支持c++20的libc++标准库。

Clang 编译 C++20 代码必须加 -std=c++20
Clang 默认不启用 C++20 特性,哪怕你用的是 Clang 12+(首个完整支持 C++20 的版本),不显式指定标准,它就按 c++17 或更低处理。不加这个参数,遇到 std::span、requires 约束、char8_t 或模块(import)会直接报错。
常见错误现象包括:
-
error: unknown type name 'span'(即使#include <span></span>了) error: expected unqualified-id before 'requires'-
error: use of undeclared identifier 'std::format'(C++20<format></format>)
正确写法:
clang++ -std=c++20 -o main main.cpp
注意:-std=gnu++20 也可用,它在 c++20 基础上额外开启 GNU 扩展(如 __attribute__ 支持更宽松),但如果你追求可移植性或和 GCC/MSVC 行为一致,优先选 -std=c++20。
Clang 12 是 C++20 功能可用的最低版本
Clang 11 及更早版本对 C++20 支持非常碎片化:比如能解析 concept 但不检查约束,std::format 根本没实现,ranges::sort 编译失败。只有 Clang 12(2021 年 9 月发布)开始宣称「feature-complete」C++20 支持。
验证方法:
clang++ --version
输出中需含 version 12.0.0 或更高。若系统包管理器装的是旧版(如 Ubuntu 20.04 自带 Clang 10),得手动装 LLVM 官方二进制或从源码编译。
关键点:
- Clang 12 支持
concepts、modules(需额外开关)、coroutines(需-fcoroutines-ts,注意不是标准 C++20 协程) - Clang 13+ 才默认启用
-fimplicit-modules等模块便利选项 - macOS 自带的
clang实为 Apple Clang,其版本号和 LLVM Clang 不同;Apple Clang 13.1(对应 Xcode 13.2)才基本对齐 Clang 12 的 C++20 支持
启用 C++20 模块要加 -fmodules 和 -fimplicit-modules
C++20 模块不是仅靠 -std=c++20 就能用的。Clang 对模块采用分阶段支持,必须显式开启:
clang++ -std=c++20 -fmodules -fimplicit-modules -fimplicit-module-maps -o main main.cpp
各参数作用:
-
-fmodules:启用模块系统(必需) -
-fimplicit-modules:自动查找当前目录及系统路径下的module.modulemap -
-fimplicit-module-maps:允许 Clang 在头文件同目录下找module.modulemap并加载
没加这些,写 import std.core; 会报 error: module 'std.core' not found。注意:Clang 当前(截至 17)仍不自带标准库模块接口,import std; 还不能用,得自己生成或依赖第三方模块映射。
调试时别漏掉 -stdlib=libc++
Clang 默认可能链接 libstdc++(GCC 的标准库),而 libstdc++ 11+ 才完整支持 C++20,且部分特性(如 std::format)在早期 libstdc++ 中是 disabled 状态。更稳妥的方式是配 Clang 官方推荐的 libc++:
clang++ -std=c++20 -stdlib=libc++ -lc++abi -o main main.cpp
原因:
-
libc++由 LLVM 团队维护,和 Clang 同步演进,C++20 特性落地更快 - 例如
std::format在 libc++ 15+ 中默认可用,而 libstdc++ 12 仍需定义_GLIBCXX_USE_CXX11_ABI=1且不保证全部功能 - macOS 上
libc++是默认标准库,Linux 下需确保已安装libc++-dev(Debian/Ubuntu)或libcxx-devel(Fedora)
如果只加 -std=c++20 却没管标准库,可能编译通过但运行时报 undefined symbol: _ZSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_construct 这类符号缺失错误——本质是 ABI 不匹配。
模块、概念、格式化这些特性看着是语言层的事,其实深度绑定编译器与标准库的协同。少一个开关,或者标准库没对齐,就会卡在看似莫名其妙的地方。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











