Подтвердить что ты не робот

Решение #define

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

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

#define MONO

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

4b9b3361

Ответ 1

Обновление. Вы не можете определить "общий вариант" для определения 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 по настройке

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

Project Build Options

Ответ 2

Я знаю решение для проектов на С# (я не проверял его на других проектах)

Например, у вас есть:

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 определение TRACING_BUILD

Для Solution2 - для всех проектов ANOTHER_DEFINE определение ANOTHER_DEFINE

Для Solution3 - все проекты - определения не добавлены

При таком подходе вы должны хранить все решения с широкими определениями решений в отдельных каталогах.

Ответ 3

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

Ответ 5

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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

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

Ответ 10

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