解决方案范围内的#define

时间:2011-03-01 00:52:12

标签: c# c-preprocessor

有没有办法全局宣布#define?

就像我想拥有一个例如

的文件一样
#define MONO

我希望所有源代码文件都知道这个预处理器指令已经定义。我将如何实现这一目标?

11 个答案:

答案 0 :(得分:33)

更新:您不能在“解决方案范围”定义afaik,但下面的答案在每个项目的基础上是可行的。

您可以在编译属性或构建选项中设置它们:

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)

请参阅“设置自定义常量”标题。

<强>更新

Microsoft Documentation on Build Options

右键单击项目并从菜单中选择属性,即可进入构建选项。

Project Build Options

答案 1 :(得分:8)

我知道C#项目的解决方案(我没有在其他任何项目中对其进行过测试)

例如,您有

Project1\
Project2\
Solution1\Solution1.sln
Solution2\Solution2.sln

在解决方案目录中创建SolutionDefines.targets文件

Project1\
Project2\
Solution1\Solution1.sln
Solution1\SolutionDefines.targets
Solution2\Solution2.sln
Solution2\SolutionDefines.targets
Solution3\Solution2.sln
Solution3\|no target file|

在每个项目文件中添加:

<Import Project="$(SolutionDir)SolutionDefines.targets" Condition="exists('$(SolutionDir)SolutionDefines.targets')" />

Solution1\SolutionDefines.targets中添加:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <DefineConstants>$(DefineConstants);TRACING_BUILD</DefineConstants>
    </PropertyGroup>
</Project>

Solution2\SolutionDefines.targets中添加:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <DefineConstants>$(DefineConstants);ANOTHER_DEFINE</DefineConstants>
    </PropertyGroup>
</Project>

在这种情况下,您有:

对于解决方案1-所有项目都添加了TRACING_BUILD定义

对于Solution2-所有项目都添加了ANOTHER_DEFINE定义

对于Solution3-所有项目-未添加定义

在这种方法中,必须将具有解决方案范围定义的所有解决方案存储在单独的目录中

答案 2 :(得分:4)

我认为没有办法创建解决方案范围的 #define。您可以为每个项目/程序集创建一个,如其他答案所述,但如果您需要所有源代码文件,则需要为解决方案中的每个项目执行此操作#define。

答案 3 :(得分:1)

在Configuration Manager中创建新的解决方案配置,并确保选中该框以创建新的项目配置。然后在每个项目的 Build 属性中,将MONO输入条件编译符号框。

答案 4 :(得分:1)

在vs 2013中,您可以使用/ define:x或/ d:x http://msdn.microsoft.com/en-us/library/0feaad6z.aspx

答案 5 :(得分:1)

还有另一种解决方法,如果我错了,请纠正我:

例如,ProjectA引用ProjectB,而ProjectsCommon包含基本静态变量。两个项目都引用ProjectsCommon

ProjectsCommon中的代码:

[assembly: InternalsVisibleTo("ProjectA")]

------------------------------------------

public class ConditionVariables
{
    public static bool IsABC { get; internal set; } = false;
}

ProjectA中的代码:

#if ABC
    ProjectsCommon.ConditionVariables.IsABC = true;
#endif

ProjectB中的代码:

if (ProjectsCommon.ConditionVariables.IsABC )
{
    // first scenario
}
else
{
    // second one
}

但是,ProjectA中的代码应首先运行。当ProjectA是bootstarapper项目时,这可能很好。

答案 6 :(得分:1)

要扩展@Murtago和@Mark Cidade的答案,使其在范围内都可以解决:

打开解决方案的配置管理器并创建一个新的配置(从最接近的匹配项复制),然后为需要不同项目的项目更改条件符号。

enter image description here

答案 7 :(得分:0)

我不知道解决方案范围的定义,但是通过执行以下操作,我能够快速向所有项目添加预处理器定义:

  1. 按住ctrl并选择每个项目
  2. 右键单击任何选定的项目,然后选择Properties
  3. 转到C/C++-> Preprocessor
  4. 点击Preprocessor Definitions旁边的小向下箭头
  5. 选择<Edit...>
  6. <different options>之后添加我的定义
  7. OK退出菜单

我正在使用带有C代码库的Visual Studio Community 2019。

答案 8 :(得分:0)

几年后,与Alexei的答案类似,但先天得到支持

根据

,可以制作类似于Directory.Build.props文件的NuGet.Config

https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2019

我们的样子:

<Project>
    <PropertyGroup>
        <DefineConstants>RC_427</DefineConstants>
    </PropertyGroup>
</Project>

它有效地将其包含在您的SLN中的所有CSPROJ文件中。由于某种原因,通过Google很难找到特定的解决方案。自MSBuild 15起出现

答案 9 :(得分:0)

如果解决方案中同时有C#和C ++项目,并且需要在它们之间共享预处理器定义。 如下在SolutionDefines.targets附近创建一些*.sln文件

<?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>

然后将这行代码添加到C / C ++ / C#*.vcproj / *.vcxproj / *.csproj项目的末尾

<Import Project="$(SolutionDir)SolutionDefines.targets" Condition="exists('$(SolutionDir)SolutionDefines.targets')" />

好的,现在您可以在C#中享用#if MY_DEFINITION,在C / C ++中享用#ifdef MY_DEFINITION。 Visual Studio C#编辑器不喜欢这种方式,并告诉您没有定义MY_DEFINITION。但是,C#编译器csc.exe可以正确获取符号。

答案 10 :(得分:-1)

预处理器指令的正确位置是VS构建配置。如果您使用命令行来构建解决方案,还可以使用/ define选项传递它。