如何通过CMake定义可展开为空的编译宏MOCKABLE?
解决CMake中为不同目标配置空宏的编译问题
你遇到的核心问题是:直接通过-DMOCKABLE=传递宏定义时,预处理器会将MOCKABLE替换成等号,导致代码变成= void func()这种无效语法,自然编译失败。要实现测试程序中MOCKABLE为virtual、主程序中为空的效果,有两种可靠方案:
方案一:头文件条件宏(直观易维护)
在公共头文件中定义条件宏,通过CMake给测试目标传递开关:
头文件(如mockable.h)
#ifndef MOCKABLE_H #define MOCKABLE_H #ifdef BUILD_FOR_TEST #define MOCKABLE virtual #else #define MOCKABLE #endif #endif // MOCKABLE_H
CMake配置
# 主程序目标 add_executable(MAIN main.cpp my_class.cpp) # 无需定义BUILD_FOR_TEST,默认MOCKABLE为空 # 测试程序目标 add_executable(TEST test.cpp my_class.cpp) target_compile_definitions(TEST PRIVATE BUILD_FOR_TEST)
方案二:直接通过CMake定义宏(简化头文件)
如果不想在头文件中添加额外的开关宏,可以通过CMake给不同目标传递不同的宏定义,配合头文件的兜底定义:
头文件(只需一行兜底)
#ifndef MOCKABLE #define MOCKABLE #endif
CMake配置
# 主程序目标:不主动定义MOCKABLE,头文件会兜底为空 add_executable(MAIN main.cpp my_class.cpp) # 测试程序目标:直接定义MOCKABLE为virtual add_executable(TEST test.cpp my_class.cpp) target_compile_definitions(TEST PRIVATE MOCKABLE=virtual)
这样,测试程序编译时,MOCKABLE会被替换为virtual;主程序编译时,头文件兜底定义MOCKABLE为空,不会产生多余语法,完美实现你要的效果:类中MOCKABLE修饰的函数在测试中为虚函数,主程序中为普通函数,同时简化了头文件的宏管理。
内容的提问来源于stack exchange,提问作者Liam Goodacre
相关产品推荐
相关产品推荐

