Gcc условная компиляция
Я изучаю условную компиляцию, и я думаю, что до сих пор я это хорошо понимаю. Теперь, если у меня есть код:
#ifdef UMP_TO_FILE
//do something here...
#endif
и я запускаю:
gcc myprogram.c -DUMP_TO_FILE
Затем компилируется блок кода "//сделать что-то здесь...". Теперь, мой вопрос:
Что именно имеет флаг -DUMP_TO_FILE?
Я думаю, что флаг "-D" и он определяет макрос "UMP_TO_FILE", но я хочу быть уверенным в синтаксисе, и "gcc -help" не говорит мне ничего об этом, и, может быть, t знать, как искать это в Интернете!
Спасибо, что поделились своими знаниями!
Ответы
Ответ 1
Вывод man gcc
содержит этот небольшой фрагмент:
-D name
Предопределить name
как макрос, с определением 1.
-D name = определение
Содержимое определения обозначается и обрабатывается так, как если бы они появлялись во время третьей фазы перевода в директиве #define
. В частности, определение будет усечено встроенными символами новой строки.
Если вы вызываете препроцессор из командной оболочки или оболочки, вам может потребоваться использовать синтаксис цитирования оболочки для защиты таких символов, как пробелы, которые имеют смысл в синтаксисе оболочки.
Если вы хотите определить функционально-подобный макрос в командной строке, напишите его список аргументов с окружающими круглыми скобками до знака равенства (если есть). Скобки имеют смысл для большинства оболочек, поэтому вам нужно будет указать вариант. С sh
и csh
работает -D'name(args...)=definition'
.
-D
и -U
обрабатываются в порядке, указанном в командной строке. Все параметры файла -imacros
и -include
обрабатываются после всех опций -D
и -U
.
Таким образом, опция -DUMP_TO_FILE
эквивалентна помещению строки #define UMP_TO_FILE 1
в исходный код (имеются тонкие различия, но здесь их не нужно покрывать).
В стороне, я считаю эту довольно плохую практику. Автор выполняет обман, чтобы он выглядел как опция компилятора DUMP_TO_FILE
, а не препроцессорный макрос. Такой умный, но это вызовет проблемы для любого, кто смотрит на источник, задаваясь вопросом, что на самом деле означает UMP_TO_FILE
.
Лично я предпочитаю видеть -DDUMP_TO_FILE
и #ifdef DUMP_TO_FILE
, поскольку он намного яснее в намерении.
Ответ 2
-D UMP_TO_FILE
Определяет значение макроса UMP_TO_FILE.
Он хотел бы ввести в свой код следующую строку:
#define UMP_TO_FILE
Если значение (UMP_TO_FILE) определено, строки кода между #ifdef и #endif будут скомпилированы. В противном случае нет.
Ответ 3
-d определяет символ. Я считаю, что большинство компиляторов также позволят присвоить значение символу, так как в -dfoo=bar
назначает бар символу foo.
Из http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options
-D имя
Предопределить имя как макрос, с определением 1.
-D name = определение
Содержимое определения символизируется и обрабатывается так, как если бы они появились во время третьей фазы перевода в директиве `#define '. В частности, определение будет усечено встроенными символами новой строки.
Если вы вызываете препроцессор из командной оболочки или оболочки, вам может понадобиться использовать синтаксис цитирования оболочки для защиты таких символов, как пробелы, которые имеют смысл в синтаксисе оболочки.
Если вы хотите определить функционально-подобный макрос в командной строке, напишите его список аргументов с окружающими круглыми скобками до знака равенства (если есть). Скобки имеют смысл для большинства оболочек, поэтому вам нужно будет указать вариант. С sh и csh работает -D'name (args...) = definition.
Параметры -D и -U обрабатываются в том порядке, в котором они указаны в командной строке. Все параметры файла -imacros и -include обрабатываются после всех опций -D и -U.