使用Clang 5.0实验C++模块:如何导出其他模块导入的类?
在Clang 5.0中转发导出模块内容的正确姿势
好问题!在Clang 5.0的实验性C++模块TS支持下,完全可以从一个模块转发导出其他模块的内容——只是你之前的写法有几个关键问题,咱们来一步步修正。
首先,修正依赖模块的导出
你的root.hehe.cppm里的hehe类没有加上export关键字,这意味着这个类只会在模块内部可见,外部模块(比如root)根本无法拿到它的导出符号。先把这个模块改对:
// root.hehe.cppm export module root.hehe; export class hehe { }; // 加上export,让这个类成为模块的导出内容
然后,在根模块中正确转发导出
Clang 5.0实现的模块TS支持export import语法来转发导出其他模块的内容,你之前的尝试方向是对的,但因为依赖模块没正确导出,所以没效果。现在修改root.cppm:
// root.cppm export module root; export import root.hehe; // 这句会把root.hehe模块的所有导出内容,转发导出到root模块中
为什么你之前的写法无效?
咱们逐个分析你试过的错误写法:
export class hehe;:这只是在当前模块中声明了一个名为hehe的类,但它和root.hehe里的hehe没有任何关联——相当于你重新定义了一个全新的类,自然无法关联到目标类型。export hehe;:这是语法错误,C++模块中不能直接导出一个未绑定到模块的标识符,必须通过export import或者导出当前模块内的定义/声明来实现。- 早期的
export import root.hehe;无效:核心原因是root.hehe模块本身没有导出hehe类,所以root模块根本没东西可转发。
测试代码与编译方式
写个简单的main.cpp验证效果:
// main.cpp import root; int main() { hehe h; // 直接通过root模块使用root.hehe中的hehe类 return 0; }
用Clang 5.0编译时,要注意先编译依赖的模块单元,再编译根模块和主程序:
# 编译依赖模块 clang++ -std=c++1z -fmodules-ts root.hehe.cppm -c -o root.hehe.o # 编译根模块 clang++ -std=c++1z -fmodules-ts root.cppm -c -o root.o # 编译主程序并链接 clang++ -std=c++1z -fmodules-ts main.cpp root.o root.hehe.o -o main
注意事项
Clang 5.0的模块支持是实验性的(基于早期C模块TS),和C20正式的模块语法有一些差异,比如模块名的解析、编译参数的要求。如果后续升级到更高版本的Clang,语法会更贴近标准,但核心的export import转发逻辑是一致的。
内容的提问来源于stack exchange,提问作者Matteo Monti
相关产品推荐
相关产品推荐

