#c# #visual-studio-2010
#c# #visual-studio-2010
Вопрос:
У меня есть приложение на C #, которое я создаю с помощью Visual Studio 2010. Чтобы помочь мне с некоторыми из моих рутинных задач в приложении, я хотел установить некоторые значения, если я скомпилировал приложение в режиме отладки. Естественно, я подумал, что директивы препроцессора были бы хорошей идеей. Моя проблема в том, что я не совсем понимаю, как их использовать. На данный момент у меня есть блок кода, который выглядит следующим образом:
#define DEBUG
... // Other code in my app
#if DEBUG
myVariable = debugValue;
#endif
Моя проблема в том, что когда я компилирую свое приложение в режиме выпуска, myVariable по-прежнему получает значение debugValue . Похоже, я неправильно определяю свою переменную препроцессора или неправильно настраиваю свой компилятор. Может кто-нибудь объяснить мне, что мне нужно сделать, чтобы для myVariable устанавливалось значение debugValue только при компиляции приложения в режиме отладки?
Спасибо!
Ответ №1:
Если вы используете #define DEBUG
для указания символа отладки, переключение в режим выпуска все равно предоставит символ, поскольку вы явно его определяете.
Попробуйте удалить #define DEBUG
строку в файлах кода. По умолчанию VS определяет DEBUG
и TRACE
в режиме отладки, и TRACE
в режиме выпуска, поэтому нет необходимости явно определять их.
Ответ №2:
Если вы об этом не знаете, возможно, вам захочется проверить атрибут «Conditional». Это позволяет украсить метод, а не встраивать директивы препроцессора:
class SomeClass
{
public void ProductionOperation()
{
//Doin' production stuff
Log(someProductionVariable);
}
[Conditional("DEBUG")]
public static void Log(string message)
{
//Write to a file
}
}
Если вы компилируете в режиме отладки, метод log будет записывать данные в файл. Если вы компилируете в режиме выпуска, условный метод становится неработоспособным. Единственное, что здесь следует иметь в виду, это то, что условный код попадет в вашу сборку, в отличие от того, если вы выгружаете его с помощью препроцессора — это различие во время выполнения. Однако, пока вы не возражаете против этого, я обнаружил, что это делает код более чистым.
(Если вы собираетесь это сделать, вы не хотите, чтобы #defining или #undefining отладочной переменной где-либо в вашем коде).
Ответ №3:
Константа ОТЛАДКИ фактически определена в свойствах вашего проекта. Перейдите в Свойства проекта -> Вкладка Сборка -> Определить константу ОТЛАДКИ.
Явно объявляя эту константу, вы переопределяете константу, объявленную VS .
Ответ №4:
Просто чтобы немного добавить к ответам Кайла и Стива..
Если вы откроете свой файл .csproj с помощью текстового редактора, вы можете увидеть, как отладка и выпуск конфигурации определяют символы.
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
...
<DefineConstants>DEBUG;TRACE</DefineConstants>
...
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
...
<DefineConstants>TRACE</DefineConstants>
...
</PropertyGroup>
Активная конфигурация устанавливается с помощью
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
но, как уже упоминал Кайл, ваш код по существу добавляет его ко всем конфигурациям.