Комплексное решение #define - PullRequest
49 голосов
/ 01 марта 2011

Есть ли способ глобально объявить #define?

Как я хочу иметь файл, например,

#define MONO

, и я хочу, чтобы все файлы исходного кодазнать, что эта директива препроцессора определена.Как бы я этого достиг?

Ответы [ 9 ]

34 голосов
/ 01 марта 2011

Обновление: вы не можете выполнить определение "на уровне решения" на этапе aaik, однако приведенный ниже ответ является работоспособным для каждого проекта.

Вы устанавливаете их в свойствах компиляции или в параметрах сборки:

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 по параметрам сборки

Вы попадаете в параметры сборкищелкнув правой кнопкой мыши по проекту и выбрав в меню свойства.

Project Build Options

10 голосов
/ 03 августа 2018

Я знаю решение для проектов 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 голосов
/ 03 марта 2011

Я не думаю, что есть способ создать для всего решения #define.Вы можете создать его для каждого проекта / сборки, как описано в других ответах, но вам нужно будет сделать это для каждого проекта в решении, если вам нужно все файлы исходного кода, чтобы знать об этом# определить.

1 голос
/ 10 января 2019

Есть еще один обходной путь, поправьте меня, если я ошибаюсь:

Например, 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 является проектом начальной загрузки.

1 голос
/ 29 апреля 2014

в 2013 году вы можете использовать / определить: x или / d: x http://msdn.microsoft.com/en-us/library/0feaad6z.aspx

0 голосов
/ 04 июля 2019

Спустя годы, и похоже на ответ Алексея, но поддерживается врожденно

Можно сделать 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>

И это эффективно включает это во все файлы CSPROJ в вашем SLN. По какой-то причине это конкретное решение безумно трудно найти через Google. Начиная с MSBuild 15

0 голосов
/ 02 мая 2019

Я не знаю определения для всего решения, но мне удалось быстро добавить определение препроцессора для всех проектов, выполнив следующие действия:

  1. удерживайте Ctrl и выберите каждый проект
  2. щелкните правой кнопкой мыши по любому выбранному проекту и выберите Properties
  3. перейти к C/C++ -> Preprocessor
  4. щелкните маленькую стрелку вниз рядом с Preprocessor Definitions
  5. выберите <Edit...>
  6. добавить мое определение после <different options>
  7. OK вне меню

Я использую Visual Studio Community 2019 с базой кода C.

0 голосов
/ 01 марта 2011

Создайте новую конфигурацию решения в Configuration Manager и убедитесь, что флажок установлен для создания новых конфигураций проекта.А затем в свойствах Build каждого проекта введите MONO в поле Условные символы компиляции .

0 голосов
/ 01 марта 2011

Подходящим местом для директивы препроцессора является конфигурация сборки VS. Если вы используете командную строку для построения своего решения, вы также можете передать его с помощью параметра / define.

...