在GNU GCC中启用C++23遇阻:为何仍识别为C++20?
问题原因及解决办法
为什么编译器把代码识别为C++20?
GCC 13虽宣称支持C23,但标准库的std模块尚未完成正式实现。目前GCC里的import std是基于C20时期的「模块技术规范(Modules TS)」做的实验性支持,而非C23标准规定的正式标准库模块。所以即便你指定了-std=c++23或-std=c++2b,编译器仍会把import std当成C20 TS的语法,报错提示需启用-fmodules-ts。
怎么解决?
有两种可行方式:
暂时改用传统写法(最省心)
把import std;替换成#include <iostream>,代码修改为:#include <iostream> int main() { std::cout << "Hello, World!\n"; }再用原命令编译:
g++-13 -std=c++23 hello_world.cpp -o hello,即可正常运行。尝试启用模块TS支持(有局限性)
若一定要用import语法,需手动添加-fmodules-ts参数,同时预编译标准库模块(GCC默认未提供预编译好的std模块):- 先预编译iostream头文件为模块:
g++-13 -std=c++23 -fmodules-ts -xc++-system-header iostream - 再编译你的程序:
g++-13 -std=c++23 -fmodules-ts hello_world.cpp -o hello
注意:这种方式属于实验性支持,不同版本GCC可能出现兼容性问题,且仅支持单个头文件的模块导入,并非完整的
std模块。- 先预编译iostream头文件为模块:
内容的提问来源于stack exchange,提问作者Hello Hello
相关产品推荐
相关产品推荐

