условная компиляция gcc - PullRequest
5 голосов
/ 14 июня 2011

Я изучаю условную компиляцию и думаю, что до сих пор хорошо ее понимаю. Теперь, если у меня есть код:

 #ifdef UMP_TO_FILE
    //do something here...
 #endif

и я бегу:

 gcc myprogram.c -DUMP_TO_FILE

Затем блок кода "// сделать что-то здесь ..." компилируется. Теперь мой вопрос:

Что именно делает флаг -DUMP_TO_FILE?

Я думаю, что флаг - "-D", и он определяет макрос "UMP_TO_FILE", но я хочу быть уверен в синтаксисе, а "gcc --help" ничего мне об этом не говорит и, возможно, я не знаю, как искать это в интернете !!

Большое спасибо за то, что поделились своими знаниями!

Ответы [ 3 ]

6 голосов
/ 14 июня 2011

Вывод man gcc содержит этот небольшой фрагмент:

-D имя

Предопределить name как макрос, с определением 1.

-D имя = определение

Содержимое определения маркируется и обрабатывается так, как если бы оно появилось на третьем этапе перевода в директиве #define. В частности, определение будет усечено символами новой строки.

Если вы вызываете препроцессор из оболочки или подобной ей оболочки, вам может понадобиться использовать синтаксис цитирования оболочки для защиты таких символов, как пробелы, которые имеют значение в синтаксисе оболочки.

Если вы хотите определить функционально-подобный макрос в командной строке, напишите его список аргументов с окружающими скобками перед знаком равенства (если есть). Круглые скобки имеют смысл для большинства оболочек, поэтому вам нужно будет указать опцию. С sh и csh, -D'name(args...)=definition' работает.

Опции

-D и -U обрабатываются в порядке, указанном в командной строке. Все параметры -imacros file и -include file обрабатываются после всех параметров -D и -U.

Таким образом, опция -DUMP_TO_FILE эквивалентна добавлению строки #define UMP_TO_FILE 1 в ваш исходный код (есть небольшие различия, но здесь нет необходимости их охватывать).


Кроме того, я считаю это довольно плохой практикой. Автор выполняет хитрость, чтобы она выглядела как опция компилятора DUMP_TO_FILE, а не как макрос препроцессора. Это довольно умно, но это может вызвать проблемы у любого, кто смотрит на источник и интересуется, что на самом деле означает UMP_TO_FILE 1042 *

Лично я бы предпочел увидеть -DDUMP_TO_FILE и #ifdef DUMP_TO_FILE, так как это намного яснее в намерениях.

2 голосов
/ 14 июня 2011

-d определяет символ.Я полагаю, что большинство компиляторов также позволяют присваивать значение символу, как в -dfoo=bar назначает строку для символа foo.

From http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options

-D name Предопределить имя как макросс определением 1.

-D имя = определение Содержимое определения токенизируется и обрабатывается так, как если бы оно появилось на третьем этапе трансляции в директиве #define.В частности, определение будет усечено встроенными символами новой строки.Если вы вызываете препроцессор из оболочки или подобной ей программы, вам может понадобиться использовать синтаксис цитирования оболочки для защиты таких символов, как пробелы, которые имеют значение в синтаксисе оболочки.

Если вы хотите определитьФункциональный макрос в командной строке записывает список аргументов с окружающими скобками перед знаком равенства (если есть).Круглые скобки имеют смысл для большинства оболочек, поэтому вам нужно будет указать опцию.При использовании sh и csh -D'name (args ...) = Definition работает.

-D и параметры -U и -U обрабатываются в порядке, указанном в командной строке.Все параметры файла -imacros и -include обрабатываются после всех параметров -D и -U.

2 голосов
/ 14 июня 2011
-D UMP_TO_FILE

Определяет значение макроса UMP_TO_FILE. Это как вставить в свой код следующую строку:

#define UMP_TO_FILE

Если значение (UMP_TO_FILE) определено, строки кода между #ifdef и #endif будут скомпилированы. В противном случае нет.

...