You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 09:07:35