Visual studio 是否可以在sln文件中而不是在项目中设置预处理器宏?(VS2008 c++)

Visual studio 是否可以在sln文件中而不是在项目中设置预处理器宏?(VS2008 c++),visual-studio,visual-c++,macros,preprocessor,Visual Studio,Visual C++,Macros,Preprocessor,我正在维护一个大型代码库,一些vcproj文件用于不同的解决方案。由于一些可怕的配置和依赖关系,处理某些构建问题的最佳方法似乎是ifdef代码,但为了做到这一点,我需要在解决方案文件级别而不是vcproj级别设置预处理器定义 可能吗 如何做到这一点?2008 sln真的很蠢,它们只有要放入解决方案资源管理器的项目/文件列表和项目依赖项,所以我认为这不是一个选项 我的直觉是用相对路径做一些事情。例如,在stdafx.h中,您可以包括..\project\u configuration.h,然后为了

我正在维护一个大型代码库,一些vcproj文件用于不同的解决方案。由于一些可怕的配置和依赖关系,处理某些构建问题的最佳方法似乎是ifdef代码,但为了做到这一点,我需要在解决方案文件级别而不是vcproj级别设置预处理器定义

可能吗


如何做到这一点?

2008 sln真的很蠢,它们只有要放入解决方案资源管理器的项目/文件列表和项目依赖项,所以我认为这不是一个选项

我的直觉是用相对路径做一些事情。例如,在stdafx.h中,您可以包括..\project\u configuration.h,然后为了构建sln a,您可以将内容签出到一个目录,然后签出到另一个目录。每个项目都有各自的项目配置


我相信您可以对vsprops文件执行类似的操作,这些文件基本上包括vcproj文件,尽管我发现随着时间的推移,要维护它们有点烦人。

选择解决方案中的所有项目。项目+属性,C/C++,预处理器,预处理器定义。加

/DSOLUTION=$(SolutionName)

现在,您可以在源代码中测试解决方案宏值。

我相信您可能需要使用VS创建一个项目属性表,所有项目都可以从VS继承。这将允许您在单个位置设置任何常见的项目设置,包括预处理器宏,并根据需要继承它们。

我还介绍了

这些可能也会起作用,但是我们的构建系统现在非常脆弱,我不能完全改变它

我提出的解决方案是在一个解决方案中克隆项目的构建配置,并给它一个不同的名称。然后我在新配置中添加了宏/预处理器定义

它似乎按预期工作。因此,一个解决方案使用旧版本配置,而另一个解决方案使用克隆版本专用配置,而不是我在不同预处理器def中实际使用的配置名称

虽然不理想,但它确实有效

如果属性更容易处理,或者SLN文件可以传入预处理器def,那就太好了。

另一种方法:

使用以下内容编辑您的vcxproj或vcxproj.user

<PreprocessorDefinitions Condition="'$(SolutionName)'=='NameOfYourSolution'">
    YOUR_DEFINITION;%(PreprocessorDefinitions)
</PreprocessorDefinitions>
它并不完美,因为它取决于您的sln文件名。 如果我们改用$SolutionConfiguration变量,那就太好了

不幸的是,我只看到项目配置的变量:$configuration


不管怎么说,它确实奏效了……

我终于找到了适合我的东西

在my C:\Users\\AppData\Local\Microsoft\MSBuild\v4.0中

我把它改了一点:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(SolutionDir)\$(SolutionName).props"  Condition="Exists('$(SolutionDir)\$(SolutionName).props')"/>      
</Project>

因此,现在,如果mysolution.props位于mysolution.sln旁边,那么我将获得整个解决方案的属性表,而不会更改项目中的任何内容。它成为我的视觉环境的一项新功能

是的-我认为sln文件不会有帮助。你的其他建议很有意思,但我们又回到了同一个问题上——如何在构建项目时区分我们所处的sln。这会不会设置预处理器宏,而不是停止向其添加?如果执行此操作,请确保项目文件的当前状态已签入且安全。@Tim:sbi有道理。如果选择所有项目后该设置为空,则必须为每个项目追加该设置。我只需要一个项目的设置,而不是解决方案中的所有项目。我只需要能够根据我使用的解决方案选择编译或不编译。好的,这样就可以了,只需忽略“选择所有项目”位。如何在visual studio内部检查这是否有效?:-我使用了一个类似的*.props文件,但我不知道我是否正确使用了它,在解决方案中为每个项目文件添加显式导入元素,这样做会更安全,因为如果在系统或MSBuild工具集之间迁移解决方案,这将继续有效。例如,如果您的计算机死机,您需要重新安装操作系统,您需要在多台计算机或多个操作系统版本上处理代码,或者您需要与其他开发人员协作。此外,您没有提到您将代码放入的具体文件。这是一个很好的解决方案。然而,VisualStudio并没有意识到这一点,所以intellisense可能有点不可靠。您必须依赖于实际的调试器来确定哪些代码行实际处于活动状态。是否有任何方法可以通过vcxproj.user取消预处理器宏的定义?