Есть ли способ глобально объявить #define?
Как будто я хочу иметь файл, который имеет, например,
#define MONO
и я хочу, чтобы все файлы исходного кода знали, что эта предпроцессорная директива определена. Как я могу это достичь?
Есть ли способ глобально объявить #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 по настройке
Вы можете перейти к вариантам сборки, щелкнув правой кнопкой мыши проект и выбрав свойства в меню.
Я знаю решение для проектов на С# (я не проверял его на других проектах)
Например, у вас есть:
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 - все проекты - определения не добавлены
При таком подходе вы должны хранить все решения с широкими определениями решений в отдельных каталогах.
Я не думаю, что есть способ создать решение #define. Вы можете создать его для каждого проекта/сборки, как рассказали другие ответы, но вам нужно будет сделать это для каждого проекта в решении, если вам нужны все файлы исходного кода, чтобы узнать об этом #define.
Здесь есть ответ, который отвечает требованию: "#define Constant на основе решения"
Создайте новую конфигурацию решения в Configuration Manager и убедитесь, что флажок установлен для создания новых конфигураций проекта. Затем в свойствах сборки каждого проекта введите MONO
в поле условных компиляций.
в vs 2013 вы можете использовать /define: x или /d: x http://msdn.microsoft.com/en-us/library/0feaad6z.aspx
Есть еще один обходной путь, поправьте меня, если я ошибаюсь:
Например, 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
является проектом начальной загрузки.
Я не знаю широкого определения решения, но я смог быстро добавить определение препроцессора для всех проектов, выполнив следующие действия:
Properties
C/C++
→ Preprocessor
Preprocessor Definitions
<Edit...>
<different options>
OK
из менюЯ использую Visual Studio Community 2019 с базой кода C.
Спустя годы, и похоже на ответ Алексея, но поддерживается врожденно
Можно сделать 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
Правильным местом для предпроцессорной директивы является конфигурация сборки VS. Если вы используете командную строку для создания своего решения, вы также можете передать ее с помощью опции/define.