Is there a way to globally declare a #define?
Like I want to have a file that has for instance,
#define MONO
and I want all source-code files to know that this pre-processor directive is defined. How would I achieve that?
Is there a way to globally declare a #define?
Like I want to have a file that has for instance,
#define MONO
and I want all source-code files to know that this pre-processor directive is defined. How would I achieve that?
Update: You cannot do a "solution-wide" define afaik, however the answer below is workable on a per-project basis.
You set them in your Compilation Properties or Build options:
http://msdn.microsoft.com/en-US/library/76zdzba1(v=VS.80).aspx (VS2008) http://msdn.microsoft.com/en-US/library/76zdzba1(v=VS.100).aspx (VS2010)
see the "To set a custom constant" heading.
Update
Microsoft Documentation on Build Options
You get to the build options by right-clicking the project and selecting properties from the menu.
I know solution for C# projects (I don't tested it for any other projects)
For example you have:
Project1\
Project2\
Solution1\Solution1.sln
Solution2\Solution2.sln
Create SolutionDefines.targets
file in solution directory
Project1\
Project2\
Solution1\Solution1.sln
Solution1\SolutionDefines.targets
Solution2\Solution2.sln
Solution2\SolutionDefines.targets
Solution3\Solution2.sln
Solution3\|no target file|
in each project file add:
<Import Project="$(SolutionDir)SolutionDefines.targets" Condition="exists('$(SolutionDir)SolutionDefines.targets')" />
In Solution1\SolutionDefines.targets
add:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<DefineConstants>$(DefineConstants);TRACING_BUILD</DefineConstants>
</PropertyGroup>
</Project>
In Solution2\SolutionDefines.targets
add:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<DefineConstants>$(DefineConstants);ANOTHER_DEFINE</DefineConstants>
</PropertyGroup>
</Project>
In this case you have:
For Solution1 - all projects have TRACING_BUILD
define added
For Solution2 - all projects have ANOTHER_DEFINE
define added
For Solution3 - all projects - no defines added
In this approach you must store all solutions with solution wide defines in separate directories
Years later, and similar to Alexei's answer but supported innately.
One can make a Directory.Build.props
similar to a NuGet.Config
file as per
https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2019
Ours looks like:
<Project>
<PropertyGroup>
<DefineConstants>RC_427</DefineConstants>
</PropertyGroup>
</Project>
And it effectively includes this into all CSPROJ files in your SLN. For some reason that particular solution is insanely hard to find via google. Been around since MSBuild 15
I don't think there is a way to create a solution-wide #define. You can create one for each project/assembly, as the other answers have described, but you'll need to do this for each and every project in the solution if you need all source code files to know of that #define.
To expand on the answers @Murtago and @Mark Cidade to make it solution wide:
Open the configuration manager for the solution and create a new configuration (copied from the closest match) then change conditional symbols for the projects that need different ones.
In case you have both C# and C++ projects in the solution and need to share preprocessor definitions among them.
Create some SolutionDefines.targets
file near your *.sln
as follows
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<DefineConstants>$(DefineConstants);MY_DEFINITION</DefineConstants>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<PreprocessorDefinitions>MY_DEFINITION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
</Project>
Then add to C/C++/C# *.vcproj
/*.vcxproj
/*.csproj
project files this line somewhere in the end
<Import Project="$(SolutionDir)SolutionDefines.targets" Condition="exists('$(SolutionDir)SolutionDefines.targets')" />
Ok, now you can enjoy #if MY_DEFINITION
in C# and #ifdef MY_DEFINITION
in C/C++. Visual Studio C# editor doesn't like this way and tells there is no MY_DEFINITION
defined. But, C# compiler csc.exe gets the symbol properly.
There is one more workaround, correct me if i'm wrong:
For example, ProjectA
references ProjectB
, and ProjectsCommon
contains base static variable. Both projects refernece ProjectsCommon
.
Code in ProjectsCommon
:
[assembly: InternalsVisibleTo("ProjectA")]
------------------------------------------
public class ConditionVariables
{
public static bool IsABC { get; internal set; } = false;
}
Code in ProjectA
:
#if ABC
ProjectsCommon.ConditionVariables.IsABC = true;
#endif
Code in ProjectB
:
if (ProjectsCommon.ConditionVariables.IsABC )
{
// first scenario
}
else
{
// second one
}
However, code in ProjectA
should run first. This is probably good when ProjectA
is a bootstarapper project.
in vs 2013 you can use /define:x or /d:x http://msdn.microsoft.com/en-us/library/0feaad6z.aspx
Create a new solution configuration in Configuration Manager and make sure that the box is checked to create new project configurations as well. And then in the Build properties of each project enter MONO
into the Conditional compilation symbols box.
The proper place for a pre-processor directive is the VS build configuration. If you are using a command line to build your solution you can also pass it using /define option.
I don't know of a solution wide definition, but I was able to quickly add a preprocessor definition to all projects by doing the following:
Properties
C/C++
--> Preprocessor
Preprocessor Definitions
<Edit...>
<different options>
OK
out of the menusI'm using Visual Studio Community 2019 with a C code base.