1

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

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

+0

Aw, noooooooooo! – 2010-08-11 14:02:13

+0

@ Неужели почему noooo? Как я уже сказал, я не знал, было ли это особенно хорошо или нет, но просто хотел использовать его снова и не помнил, что это было особенно сложно. – identitycrisisuk

+5

Код, который компилируется по-разному для разных людей? Нет, спасибо! – 2010-08-11 14:24:23

ответ

5

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

  • правой кнопкой мыши имя проекта в панели Project Explorer.
  • Выберите страницу свойств
  • Свойства
  • Open Configuration, C/C++, Preprocessor (то есть место VS2008, но он должен быть похож на VS2005)
  • Для Определения Препроцессора, должно быть WIN32; _DEBUG и prehaps другие. В конце добавить ; your_name = «$ (your_name)»
  • Обратите внимание, что получить очень расстроен есть пространство в Evar your_name,
+0

Это кажется самым близким к желаемому эффекту, я должен был забыть о настройке, кажется, прекрасно, если вы просто положили $ (YOUR_NAME) в preprocessor defs? Это означает, что я могу просто добавить его в сборку отладки, поэтому нет возможности выпуска версии с поведением, уникальным для компьютера, в основном она использовалась для вывода дополнительной отладочной информации, которую никто больше не интересует. – identitycrisisuk

+0

Просто добавление $ (Ваше_имя) было бы похоже на «#define James_Curran» –

+0

Да, это был желаемый эффект, я не думаю, что начальный вопрос очень хорошо его описал, так как я не помнил его. – identitycrisisuk

0

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

+1

Мне нравится, когда я получаю нисходящий ответ для ответа 3+ лет назад, который является точным и который фактически соответствует ответу, который имеет + 5 принято в том же вопросе. Потрясающие. –

0

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

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

1

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


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

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

/D NAME_%YOUR_NAME% 

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

#if defined(NAME_identitycrisisuk) 

или что-то ваше имя пользователя.

+0

Тестирование переменных среды с помощью! If в make-файле является обычным явлением. –

2

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

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

+0

с решением на уровне источника, как это, вы можете совершить код, который на самом деле НЕ МОЖЕТ БЫТЬ ПОСТРОЕН для кого-то другого, например #ifdef COLLEGUE_NAME ... int something = ... Пожалуйста, заполните это;] , чтобы парень знал, что он задача трудная: d –