如何在C++模块接口与实现单元间共享宏定义?
解决C++模块接口与实现单元间共享宏定义的问题
你遇到的错误是因为C++模块的接口单元和实现单元是独立的预处理单元——接口里定义的宏在预处理阶段就被展开或取消定义了,不会自动传递到实现单元,所以实现里找不到GENERATED_FUNCTIONS_LIST是必然的。
要在两者间共享宏定义,最直接的方案是把共享的宏单独抽出来放到头文件里,然后在接口和实现单元中分别包含这个头文件:
创建共享宏头文件
新建一个SomeModuleMacros.h文件,把需要共享的GENERATED_FUNCTIONS_LIST放进去,同时加上头文件保护避免重复包含:#pragma once #define GENERATED_FUNCTIONS_LIST \ GENERATED_FUNCTION(void, some_function, int param1, double param2) \ GENERATED_FUNCTION(void, some_function2, int param1, float param2) \ GENERATED_FUNCTION(void, some_function3, int* param1, int** param2)修改接口单元(SomeModule.ixx)
包含共享头文件,然后按原逻辑定义并展开宏:export module SomeModule; #include "SomeModuleMacros.h" // 定义生成函数原型的宏并展开 #define GENERATED_FUNCTION(ret, name, ...) typedef ret name##_prototype(__VA_ARGS__); GENERATED_FUNCTIONS_LIST #undef GENERATED_FUNCTION export struct SomeStruct { void init(); // 定义生成结构体成员的宏并展开 #define GENERATED_FUNCTION(ret, name, ...) \ name##_prototype* name; GENERATED_FUNCTIONS_LIST #undef GENERATED_FUNCTION };修改实现单元(SomeModuleImpl.cpp)
同样包含共享头文件,然后定义对应的赋值宏并展开:module SomeModule; #include "SomeModuleMacros.h" void SomeStruct::init() { // 定义成员赋值的宏并展开,建议用nullptr替代NULL符合C++标准 #define GENERATED_FUNCTION(ret, name, ...) \ name = nullptr; GENERATED_FUNCTIONS_LIST #undef GENERATED_FUNCTION }
这样处理后,接口和实现单元都会在预处理阶段拿到GENERATED_FUNCTIONS_LIST的定义,配合各自单元内的GENERATED_FUNCTION宏定义,就能完成你需要的代码生成逻辑。
另外提醒一句:尽量用nullptr代替NULL,这是C++11及以后的标准空指针写法,类型更安全。
内容的提问来源于stack exchange,提问作者imad
相关产品推荐
相关产品推荐

