Как узнать, существует ли переменная окружения во время компиляции? - PullRequest
2 голосов
/ 11 августа 2010

Я не знаю, хорошо это или нет, но я работал где-то, где у каждого была переменная окружения, такая как YOUR_NAME, на своем компьютере.Тогда, если у вас есть небольшой отладочный код, представляющий интерес только для вас, вы можете поместить его в #if defined( YOUR_NAME ), и он даже не будет скомпилирован для кого-то другого, если он не изменит его на #if defined( YOUR_NAME ) || defined( THEIR_NAME ).

Я только что попытался сделать это сам, и это, похоже, не работает, перезапустил Visual Studio, а затем компьютер, но он все еще не поднят.Было ли в этом хаке что-то большее, чем я понял, или для него требуется конкретная версия / опция, выбранная в Visual Studio?

Ответы [ 5 ]

5 голосов
/ 11 августа 2010

Опираясь на то, что установил IanH, из Visual Studio,

  • щелкните правой кнопкой мыши имя проекта на панели Project Explorer.
  • Выберите страницу свойств
  • Открыть свойства конфигурации, C / C ++, Препроцессор (то есть расположение VS2008, но оно должно быть аналогичным в vs2005)
  • Для определений препроцессора должно быть WIN32; _DEBUG и другие. В конце добавьте ; YOUR_NAME = "$ (YOUR_NAME)"
  • Обратите внимание, что это очень расстраивает, если в эваре есть пробел YOUR_NAME,
2 голосов
/ 11 августа 2010

Довольно пугающая концепция, но если вы действительно хотите это сделать, вы можете указать определение препроцессора в настройках проекта Visual Studio следующим образом: YOUR_NAME=$(USERNAME), поскольку на компьютерах с Windows определена переменная окружения %USERNAME%.Если вы заинтересованы в использовании этого из командной строки (или в этом случае в Makefile), вы можете указать /DYOUR_NAME=%USER_NAME% в качестве аргумента для cl.exe.

PS: Даже если то, что вы описали, возможно, выВозможно, захочется пересмотреть эту практику.Если вы хотите, чтобы определенные функции включались только в определенных сценариях, рассмотрите возможность использования некоторых других переключателей, которые включают / отключают определенные функции, например: значения реестра, файлы конфигурации и любые другие флаги, которые вы сочтете целесообразными.Это, по крайней мере, обеспечит возможность тестирования всех ваших коллег на одинаковых двоичных файлах.На самом деле это довольно распространенная практика, используемая иногда в средах с непрерывной интеграцией , чтобы вы могли интегрироваться на ранних этапах и при этом не заставлять других ждать, пока вы не завершите или не исправите функцию.Этот условный переключатель, конечно, удаляется, как только функция, даже удаленная, кажется, готова хорошо играть с остальной частью вашего продукта.

1 голос
/ 11 августа 2010

Редактировать: я не пробовал свой ответ, потому что в настоящее время я работаю в Eclipse / Linux и, следовательно, не могу его протестировать, но я думаю, что он должен работать.(Соответствующий вариант Linux / Eclipse работает нормально).


Вы должны передать переменную окружения в вызове компилятора (или построить скрипт / Makefile) как переключатель / D% YOUR_NAME%.

Чтобы избежать проблем, когда% YOUR_NAME% не определен, вы можете добавить еще одну строку перед ним, например,

/D NAME_%YOUR_NAME%

Затем вы можете использовать

#if defined(NAME_identitycrisisuk)

или любую другуюимя пользователя.

0 голосов
/ 11 августа 2010

Я только что провел быстрое тестирование, и, очевидно, VC ++ 2005 не выполняет автоматическое преобразование переменных среды в символы препроцессора (это две совершенно разные вещи).

Так что вам нужно изменить некоторые настройки, чтобы каждый пользовательполучает свой символ.

0 голосов
/ 11 августа 2010

Вы не можете. Определения препроцессора не имеют абсолютно никакого отношения к переменным среды. Вам нужно, чтобы у каждого пользователя были свои собственные файлы проекта, и каждый пользователь должен был бы добавить дополнительную директиву define к самому файлу проекта, которая будет передана в cl.exe как ключ / D.

...