C++20模块实现分区下非导出符号是否仍可保留hpp/cpp分离
针对你场景的两种推荐实践
不需要使用你提到的空接口分区的取巧方案,完全可以保留声明实现分离的习惯:
方案1:内部头文件+模块实现分区组合
你可以把原本Foo的声明放到仅模块内部使用的普通头文件里,不需要加任何模块相关声明,再在模块实现分区中引入这个头文件并写实现即可:
内部头文件foo_internal.hpp代码示例:class Foo { public: void do_something(); int get_val() const; private: int val = 0; };模块实现分区代码示例:
module parent:foo; // 注意#include必须放在module声明之后,头文件内容会全部归入parent模块的私有作用域 #include "foo_internal.hpp" void Foo::do_something() { val++; } int Foo::get_val() const { return val; }这种方式不会对外暴露任何
Foo相关的符号,也不会出现符号冲突,完全满足内部使用的需求。方案2:独立私有模块拆分
如果Foo的逻辑独立性较高,你可以直接把它做成无导出的独立私有模块,天然支持声明实现分离:
私有模块接口单元代码示例:export module parent.foo; // 这里的Foo没有加export,不会对外导出 class Foo { public: void do_something(); int get_val() const; private: int val = 0; };私有模块实现单元代码示例:
module parent.foo; void Foo::do_something() { val++; } int Foo::get_val() const { return val; }主模块直接
import parent.foo;即可使用Foo,外部完全无法访问该模块的任何内容。
关于hpp/cpp分离模式的弃用问题
传统分离模式完全不需要因为模块的普及被弃用,两种用法可以按需共存:
- 对外导出的公共接口,推荐直接写在模块接口单元中,避免传统头文件的宏污染、重复包含、导入顺序敏感等问题
- 仅内部使用的私有逻辑,你可以根据自己的开发习惯自由选择是将声明实现都放在模块实现单元中,还是继续沿用传统的头文件+实现文件的拆分模式,两种写法没有性能、规范层面的优劣差异。
内容的提问来源于stack exchange,提问作者Touloudou
相关产品推荐
相关产品推荐

