In a C++ file, I have a code like this:
#if ACTIVATE
# pragma message( \"Activated\" )
#else
# pragma message( \"Not Activated\")
#endif
I
It should probably be:
#ifdef ACTIVATE
# pragma message( "Activated" )
#else
# pragma message( "Not Activated")
#endif
I'm a little late to the party (only 4 years or so), but I just had to workaround this problem on a project, and stumbled across this question while searching for a fix. Our solution was to use an environment variable with /D
defines in it, combined with the Additional Options box in visual studio.
$(ExternalCompilerOptions)
, to the Additional Options under project options->C/C++->Command Line (remember both Debug and Release configs)/D
compiler option to define your macros c:\> set ExternalCompilerOptions=/DFOO /DBAR
c:\> msbuild
Item #1 ends up looking like this in the vcxproj file:
<ClCompile>
<AdditionalOptions>$(ExternalCompilerOptions) ... </AdditionalOptions>
</ClCompile>
This works for me with VS 2010. We drive msbuild from various build scripts, so the environment variable ugliness is hidden a bit. Note that I have not tested if this works when you need to set the define to specific value ( /DACTIVATE=1
). I think it would work, but I'm concerned about having multiple '='s in there.
H^2
As @bigh_29 has mentioned, using environment variables to define or undefine a preprocessor.
What he suggested the way to undefine a preprocessor is actually /UACTIVATE.
This way, any preprocessor matching ACTIVATE will be negated and compiler wouldn't go through your #if ACTIVATE #endif enclosure.
I needed to do this too - needed to be able to build two different versions of my app and wanted to be able to script the build using VCBUILD. VCBUILD does have the /override command line switch, but I am not sure it can be used to modify #define symbols that can then be tested using #if conditional compilation.
The solution I cam up with was to write a simple utility to create a header file that #defined the symbol based on the state of an environment variable and run the utility from a pre-build step. Prior to each execution of the VCBUILD step the script sets the environment variable and "touches" a file in the app to ensure that the prebuild step is executed.
Yes, it is an ugly hack, but it was the best I could come up with!
Maybe it is a bad idea to answer such old question, but recently I googled a similar problem and found this topic. I wrote a cmd script for some build system and I was succeed to find a solution. I leave it here for future generations (:
According to @acemtp's problem, my solution would look like this:
@echo off
:: it is considered that Visual Studio tools are in the PATH
if "%1"=="USE_ACTIVATE_MACRO" (
:: if parameter USE_ACTIVATE_MACRO is passed to script
:: the macro ACTIVATE will be defined for the project
set CL=/DACTIVATE#1
)
call msbuild /t:Rebuild /p:Configuration=Release
UPD: I tried to use set CL=/DACTIVATE=1
and it also worked, but the official documentation recommends to use number sign