编译C++模块实现单元时为何出现C4844警告?
C++模块拆分编译时Visual Studio C4844警告问题
我尝试将模块实现的部分代码拆分到单独的源文件作为模块实现单元,相关代码文件如下:
代码文件内容
banana.cppm
export module banana; export int banana();
banana.impl.cppm
module banana; int banana() { return 42; }
使用Visual Studio编译时出现C4844警告:
1> banana.impl.cppm(1,14): warning C4844: 'export module banana;' is now the preferred syntax for declaring a module interface
请问这是什么原因?如何消除该警告?
原因分析
这个警告源于Visual Studio对C++模块文件的后缀识别规则:
.cppm是C++模块接口单元的标准约定后缀,编译器会默认把该后缀的文件当作接口单元处理。而接口单元要求用export module 模块名;的语法声明,你的banana.impl.cppm用了.cppm后缀但开头只写了module banana;,不符合接口单元的语法要求,因此触发警告。- 但实际上
banana.impl.cppm是模块实现单元,不该使用接口单元的后缀。
消除警告的方法
有两种可靠的解决方式:
- 修改文件后缀(推荐):将
banana.impl.cppm的后缀改为.cpp,编译器会自动识别这是模块实现单元,无需修改代码内容,保留module banana;开头即可。这种方式符合C++模块的命名惯例,代码可读性更强。 - 显式声明单元类型:若不想修改后缀,可在文件开头添加
:private标记明确这是实现单元,代码修改为:
module :private banana; int banana() { return 42; }
内容的提问来源于stack exchange,提问作者ComicSansMS
相关产品推荐
相关产品推荐

