C++条件声明宏的正确方式及VS多项目宏配置问题
问题根源
核心问题在于Lib项目是独立编译的:当你编译UnitTest时,Lib已经提前完成编译(此时Lib的编译环境未定义UNITTESTS宏),lib.h里的MY_TEST_MACRO值已被固定为0。预处理器宏是编译阶段生效的,UnitTest后续设置的宏无法修改已编译完成的Lib二进制内容。
解决方案
要实现编译UnitTest时MY_TEST_MACRO为1、单独编译Lib时为0,可采用两种可靠方式:
方式一:为Lib创建测试专用配置(推荐)
这是VS项目的标准解决方案:
- 打开Lib项目属性页,进入「配置管理器」,复制当前Debug/Release配置,新建一个测试专用配置(比如命名为
Debug_Test)。 - 在该新配置的「预处理器定义」中添加
UNITTESTS,和你在UnitTest里的设置一致。 - 打开UnitTest项目属性页,在对应配置(比如Debug)下,将依赖的Lib版本切换为
Debug_Test配置生成的Lib文件;或者在「项目依赖」中,让UnitTest关联Lib的测试配置。 - 编译UnitTest时选择对应配置,此时Lib会带着
UNITTESTS宏重新编译,MY_TEST_MACRO就会被设为1。
方式二:将Lib源码并入UnitTest项目(适合小型Lib)
如果Lib代码量不大,可跳过独立编译,直接将Lib源码加入UnitTest项目:
- 把
lib.h、lib.cpp添加到UnitTest项目中,移除对Lib项目的依赖。 - 编译UnitTest时,所有代码(包括Lib代码)都会在
UNITTESTS宏的环境下编译,MY_TEST_MACRO自动设为1;单独编译Lib项目时,因无UNITTESTS宏,MY_TEST_MACRO为0。
补充说明
不要尝试跨项目传递预处理器宏——VS的项目编译是独立的,每个项目的宏只作用于自身编译过程,无法传递给依赖项目。
内容的提问来源于stack exchange,提问作者Niranjan Agnihotri
相关产品推荐
相关产品推荐

