有没有办法全局声明#define?
就像我想拥有一个文件,例如,
#define MONO
我希望所有源代码文件都知道这个预处理器指令已经定义。我怎么做到这一点?
更新:您不能在“解决方案范围”定义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
右键单击项目并从菜单中选择属性,即可进入构建选项。
我知道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 - 所有项目 - 未添加任何定义
在此方法中,您必须将解决方案范围定义的所有解决方案存储在单独的目
我认为没有办法创建解决方案范围的#define。您可以为每个项目/程序集创建一个,如其他答案所述,但如果您需要所有源代码文件以了解该#define,则需要为解决方案中的每个项目执行此操作。
在vs 2013中,您可以使用/ define:x或/ d:x http://msdn.microsoft.com/en-us/library/0feaad6z.aspx
还有一个解决方法,如果我错了,请纠正我:
例如,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项目时,这可能是好的。
在Configuration Manager中创建新的解决方案配置,并确保选中该框以创建新的项目配置。然后在每个项目的Build属性中输入if (ProjectsCommon.ConditionVariables.IsABC )
{
// first scenario
}
else
{
// second one
}
到Conditional compilation symbols框中。
我不知道解决方案的广泛定义,但我能够通过执行以下操作快速向所有项目添加预处理器定义:
ProjectA
ProjectA
- > MONO
Properties
旁边的小向下箭头C/C++
Preprocessor
之后添加我的定义Preprocessor Definitions
我正在使用带有C代码库的Visual Studio Community 2019。
多年以后,和阿列克谢的答案相似,但天生就支持了
人们可以制作类似于<Edit...>
文件的<different options>
OK
我们看起来像:
Directory.Build.props
它有效地将其包含在SLN中的所有CSPROJ文件中。出于某种原因,特定的解决方案很难通过谷歌找到。自MSBuild 15以来一直存在
预处理器指令的适当位置是VS构建配置。如果使用命令行构建解决方案,还可以使用/ define选项传递它。