前言
最近在图书馆借了一本书,书名为《Professional C++》,Sixth Edition;中文名为《C++23高级编程》,作者为 Marc Gregoire。了了翻了几页,从 Hello, World! 开始便立刻吸引了我。其代码内容如下:
import std;
int main()
{
std::println("Hello, World!");
return 0;
}
突然发现曾经熟悉的 C++ 变成了完全陌生的模样。既没有用 printf,也没有用 std::cout,并且开头整成了和 Python 一样的 import。初步了解了一下,发现这是 C++20 开始引入的新特性,让 C 语言有了“预编译”模块,于是便像 Python 解释器语言一样,大大节省了编译时间 Precompiled headers(PCHs)。在我编写 C++ 大型程序的年代,主要是通过各种头文件宏的方式来尽可能减少重复编译,没想到几年时间变化如此之大。于是我立马借了这本书,尝试在自己电脑上运行一下这个新的 C++23 标准。
编译器支持
import std这样的特性虽然在 C++20 的标准就已经提出,但是编译器的支持非常有限,GCC 15 才开始支持,Clang 也到 18.1.2 之后才开始支持,而这两个编译器都是 2025 年左右才更新。(那本书也是 2025 年印刷的)于是我开始下载 GCC 仓库并且切换到 15.2 分支,然后编译安装。
编译安装 GCC 15.2
git clone https://gcc.gnu.org/git/gcc.git gcc-git
这一步根据网络条件需要比较长时间,但是因为是全量下载,一次下载后可以安装多个版本的 GCC。
cd gcc-git
git checkout releases/gcc-15.2.0
./contrib/download_prerequisites
这一步就切到了 15.2.0 的分支,同时下载对应版本的依赖包,然后开始编译安装,其中要确定安装的地方,最好是单独创建一个文件夹,如 ~/packages/gcc/15.2,接下来开始编译安装:
mkdir build
cd build
../configure --prefix=~/packages/gcc/15.2 --enable-multilib --enable-langrages=c,c++,fortran 2>&1 | tee configure.log
make -j8 2>&1 | tee make.log
make install 2>&1 | tee install.log
如果编译报错,报错信息都保存在 configure.log、make.log、install.log 中,根据报错信息搜索,安装其他需要的软件。一般较新的 GCC 安装过程都还算顺利。
预编译 std 模块
这一步很重要,本来我以为编译安装好 GCC 之后,设置好 PATH 和 LD_LIBRARY_PATH 就可以直接编译 import std; 的 C++ 文件,结果在运行下面命令之后出现了报错,报错信息为:
In module imported at main.cpp:1:1:
std: error: failed to read compiled module: No such file or directory
std: note: compiled module file is ‘gcm.cache/std.gcm’
std: note: imports must be built before being imported
std: fatal error: returning to the gate for a mechanical issue
compilation terminated.
后经了解发现,g++ 15.2 带相关模组,但是并没有编译,同时默认的模式依然不是 import 模式,需要打开 -fmodules -std=c++23 两个开关,同时自己编译好 std 模块(~/packages/gcc/15.2/include/c++/15.2.0/bits/std.cc)才可以使用 import std;,具体编译 std 的命令如下:
~/packages/gcc/15.2/bin/g++ -std=c++23 -fmodules -fsearch-include-path -fmodule-only -c ~/packages/gcc/15.2/include/c++/15.2.0/bits/std.cc
此时目录下会出现一个文件夹 gcm.cache/std.gcm,这时候 std 代码已经变成了 C++23 标准中的模组了,此时再运行
g++ -fmodules -std=c++23 main.cpp
./a.out
便出现Hello, World!
CMake 编译运行
CMake 也需要 3.30 以上的版本才能支持 import std 这样的操作。同时在 CMakeLists.txt 文件中需要显式指定打开 import std 这样的操作才行,同时 Makefile 目前暂不支持,所以需要引入 Ninja 编译模块,具体操作内容如下:
下载编译 CMake 4.2.1
下载链接 https://cmake.org/download/ ; 下载下来后解压,然后进入 cmake 目录运行
mkdir build
cd build
cmake ..
make
此时在 build/bin 目录下会有新的 cmake 可执行文件出现,将 cmake 添加到系统路径中。
编写 CMakeLists.txt
cmake_minimum_required(VERSION 4.2.1)
# The UUID enables experimental "import std" support for C++23/26.
# This specific UUID is valid for CMake 4.x versions as of 2026.
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "d0edc3af-4c50-42ea-a356-e2862fe7a444")
project(Cpp23Modules LANGUAGES CXX)
# Global setting to allow targets to use 'import std;'
set(CMAKE_CXX_MODULE_STD ON)
set(CMAKE_CXX_STANDARD 23)
add_executable(hello_world main.cpp)
# Required: Target must be C++23 or newer for 'import std;'
target_compile_features(hello_world PRIVATE cxx_std_23)
# Enable module scanning for this target
set_target_properties(hello_world PROPERTIES
CXX_SCAN_FOR_MODULES ON
CXX_MODULE_STD ON
)
其中 set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "d0edc3af-4c50-42ea-a356-e2862fe7a444") 是 CMake 为了支持 IMPORT_STD 打开的测试模式,具体后面的值在 cmake-4.2.1/Help/dev/experimental.rst 中有写,根据以后更新的不同 CMake 版本进行修改即可。
编译运行
最后在用 CMake 时需要指定 Ninja,具体命令如下:
mkdir build
cd build
cmake -G Ninja ..
ninja
./hello_world
总结
从整体上来看,当初 C++11 开启现代 C++ 语言时,也是使用起来非常吃力。还记得公司一个同事使用了新特性写了一整个 2000 行的 template 类文件合入分支使用了超级多的 C++14 新特性,然后就只有他一个人能看懂那个代码。但是现在C++14已经成为了众多编译器默认使用的存在。
C++20 的 import 新功能到如今依然没有完善,在搜索查询过程中,发现很多人都在吐槽各种难用和bug,但是大势不可逆转,尽快跟上时代的发展,才能不被抛弃。

