簡體   English   中英

解決方案范圍內的#define

[英]Solution-wide #define

有沒有辦法全局聲明#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 文檔

您可以通過右鍵單擊項目並從菜單中選擇屬性來訪問構建選項。

項目構建選項

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

對於解決方案 2 - 所有項目都添加了ANOTHER_DEFINE定義

對於解決方案 3 - 所有項目 - 沒有添加定義

在這種方法中,您必須將具有解決方案范圍定義的所有解決方案存儲在單獨的目錄中

多年后,與阿列克謝的回答相似,但天生支持

可以根據以下內容制作類似於NuGet.Config文件的Directory.Build.props

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

我們的看起來像:

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

它有效地將其包含在您的 SLN 中的所有 CSPROJ 文件中。 出於某種原因,通過谷歌很難找到特定的解決方案。 自 MSBuild 15 以來一直存在

我認為沒有辦法創建解決方案范圍的#define。 您可以為每個項目/程序集創建一個,正如其他答案所描述的那樣,但是如果您需要所有源代碼文件都知道#define,則需要為解決方案中的每個項目都這樣做。

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

在 Configuration Manager 中創建新的解決方案配置,並確保選中該框以創建新的項目配置。 然后在每個項目的構建屬性中,在條件編譯符號框中輸入MONO

還有一種解決方法,如果我錯了,請糾正我:

例如, 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 項目時,這可能很好。

要擴展@Murtago 和@Mark Cidade 的答案,使其解決方案更廣泛:

打開解決方案的配置管理器並創建一個新配置(從最接近的匹配項中復制),然后為需要不同的項目更改條件符號。

在此處輸入圖片說明

預處理器指令的正確位置是 VS 構建配置。 如果您使用命令行來構建您的解決方案,您還可以使用 /define 選項傳遞它。

我不知道解決方案廣泛的定義,但我能夠通過執行以下操作快速向所有項目添加預處理器定義:

  1. 按住 ctrl 並選擇每個項目
  2. 右鍵單擊任何選定的項目並選擇Properties
  3. 轉到C/C++ --> Preprocessor
  4. 單擊Preprocessor Definitions旁邊的小向下箭頭
  5. 選擇<Edit...>
  6. <different options>之后添加我的定義
  7. OK退出菜單

我正在使用帶有 C 代碼庫的 Visual Studio Community 2019。

如果您在解決方案中有 C# 和 C++ 項目並且需要在它們之間共享預處理器定義。 在您的*.sln附近創建一些SolutionDefines.targets文件,如下所示

<?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 正確獲取符號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM