解决方案范围内的#define

问题描述 投票:45回答:8

有没有办法全局声明#define?

就像我想拥有一个文件,例如,

#define MONO

我希望所有源代码文件都知道这个预处理器指令已经定义。我怎么做到这一点?

c# c-preprocessor
8个回答
34
投票

更新:您不能在“解决方案范围”定义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

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


10
投票

我知道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>

在这种情况下,你有:

对于Solution1 - 所有项目都添加了TRACING_BUILD定义

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

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

在此方法中,您必须将解决方案范围定义的所有解决方案存储在单独的目


4
投票

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


1
投票

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


1
投票

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

例如,qazxsw poi引用qazxsw poi,而qazxsw poi包含基本静态变量。这两个项目都引用了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是一个bootstarapper项目时,这可能是好的。


0
投票

在Configuration Manager中创建新的解决方案配置,并确保选中该框以创建新的项目配置。然后在每个项目的Build属性中输入if (ProjectsCommon.ConditionVariables.IsABC ) { // first scenario } else { // second one } 到Conditional compilation symbols框中。


0
投票

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

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

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


0
投票

多年以后,和阿列克谢的答案相似,但天生就支持了

人们可以制作类似于<Edit...>文件的<different options>

OK

我们看起来像:

Directory.Build.props

它有效地将其包含在SLN中的所有CSPROJ文件中。出于某种原因,特定的解决方案很难通过谷歌找到。自MSBuild 15以来一直存在


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.