如何使用 C++23 标准的 import std

前言

最近在图书馆借了一本书,书名为《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.logmake.loginstall.log 中,根据报错信息搜索,安装其他需要的软件。一般较新的 GCC 安装过程都还算顺利。

预编译 std 模块

这一步很重要,本来我以为编译安装好 GCC 之后,设置好 PATHLD_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,但是大势不可逆转,尽快跟上时代的发展,才能不被抛弃。

文章标题:如何使用 C++23 标准的 import std
文章作者:Myron
转载链接:https://sunwaybits.tech/how-to-use-import-std-in-c23-standard/
暂无评论

发送评论 编辑评论


				
😃
😄
😁
😆
😅
😂
🤣
🥲
😊
😇
🙂
🙃
😉
😌
😍
🥰
😘
😗
😙
😚
😋
😛
😝
😜
🤪
🤨
🧐
🤓
😎
🥸
🤩
🥳
😏
😒
😞
😔
😟
😕
🙁
😣
😖
😫
😩
🥺
😢
😭
😤
😠
😡
🤬
🤯
😳
🥵
🥶
😱
😨
😰
😥
😓
🤗
🤔
🤭
🤫
🤥
😶
😐
😑
😬
🙄
Emoji
上一篇