Использование директив препроцессора в Visual Studio 2010 с C # - PullRequest
6 голосов
/ 06 октября 2011

У меня есть приложение C #, которое я создаю с помощью Visual Studio 2010. Чтобы помочь мне с некоторыми из моих рутинных задач в приложении, я хотел установить некоторые значения, если я скомпилировал приложение в режиме отладки.Естественно, хотя директивы препроцессора были бы хорошей идеей.Моя проблема в том, что я не совсем понимаю, как их использовать.В настоящее время у меня есть блок кода, который выглядит следующим образом:

#define DEBUG

... // Other code in my app

#if DEBUG
  myVariable = debugValue;
#endif

Моя проблема в том, что, когда я компилирую свое приложение в режиме выпуска, myVariable все равно получает значение debugValue.Как будто я неправильно определяю переменную препроцессора или неправильно настраиваю компилятор.Кто-нибудь может объяснить мне, что мне нужно сделать, чтобы myVariable был установлен на debugValue только когда я компилирую приложение в режиме отладки?

Спасибо!

Ответы [ 4 ]

11 голосов
/ 06 октября 2011

Если вы используете #define DEBUG для указания символа отладки, переключение в режим выпуска будет по-прежнему предоставлять символ, поскольку вы явно его определяете.

Попробуйте удалить строку #define DEBUG в файлах кода.,По умолчанию VS определяет DEBUG и TRACE в режиме отладки и TRACE в режиме выпуска, поэтому нет необходимости явно определять их.

9 голосов
/ 06 октября 2011

Если вы не знаете об этом, вы можете проверить «Условный» атрибут . Это позволяет вам декорировать метод, а не вставлять директивы препроцессора:

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 переменная DEBUG где-либо в вашем коде).

5 голосов
/ 06 октября 2011

Константа DEBUG фактически определена в свойствах вашего проекта. Перейдите в Свойства проекта-> Закладка сборки-> Определить постоянную отладки.

Явно объявив эту константу, вы переопределяете ту, которая объявлена ​​VS.

4 голосов
/ 06 октября 2011

Просто чтобы добавить немного к ответам Кайла и Стива.

Если вы откроете свой файл .csproj в текстовом редакторе, вы увидите, как отладка и выпуск конфигурации определяют символы.*

Активная конфигурация установлена ​​на

<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>

, но, как уже упоминал Кайл, ваш код по существу добавляет его во все конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...