如果您需要定义一些常量(不仅仅是true/false),您可以通过以下方式进行:
在命令行上:
MSBuild /p:MyDefine=MyValue
在 vcxproj 文件中(在 <ClCompile> 部分;和/或 <ResourceCompile>,取决于您需要的位置):
<PreprocessorDefinitions>MY_DEFINE=$(MyDefine);$(PreprocessorDefinitions)</PreprocessorDefinitions>
请注意,如果您在调用MSBuild 时未指定/p:MyDefine=MyValue,则空字符串将被分配给MY_DEFINE 宏。如果你觉得没问题,就是这样。如果没有,请继续阅读。
如果未指定相应的 MSBuild 参数,如何使宏未定义
要使MY_DEFINE 宏未定义而不是空字符串,您可以使用以下技巧:
<ClCompile>
....
<PreprocessorDefinitions>_DEBUG;_CONSOLE;OTHER_UNCONDITIONAL_MACROS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(MyDefine)'!=''">MY_DEFINE=$(MyDefine);%(PreprocessorDefinitions)</PreprocessorDefinitions>
....
</ClCompile>
首先PreprocessorDefinitions 定义无条件宏。当MyDefine 不是空字符串时,第二个PreprocessorDefinitions 还定义了MY_DEFINE 宏。您可以通过将以下代码放入您的 cpp 文件中来进行测试:
#define STRINGIZE2(x) #x
#define STRINGIZE(x) STRINGIZE2(x)
#ifndef MY_DEFINE
#pragma message("MY_DEFINE is not defined.")
#else
#pragma message("MY_DEFINE is defined to: [" STRINGIZE(MY_DEFINE) "]")
#endif
并运行:
> MSBuild SandBox.sln /p:Configuration=Debug /p:MyDefine=test /t:Rebuild
...
MY_DEFINE is defined to: [test]
...
> MSBuild SandBox.sln /p:Configuration=Debug /p:MyDefine= /t:Rebuild
...
MY_DEFINE is not defined.
...
> MSBuild SandBox.sln /p:Configuration=Debug /t:Rebuild
...
MY_DEFINE is not defined.
...