Приоритет -D MACRO и #define MACRO - PullRequest
9 голосов
/ 19 октября 2010

Если у меня есть C файл foo.c, и пока я указал -DMACRO=1 в качестве параметра командной строки для компиляции. Однако, если в заголовочном файле также у меня есть

#define MACRO 2

Какие из них получат приоритет?

Ответы [ 5 ]

8 голосов
/ 15 мая 2012

Я предполагаю, что вы делаете, но если вы хотите ввести из командной строки значение не по умолчанию для этого макроса, попробуйте это для определения макроса:

#ifndef MACRO
#define MACRO 2
#endif

Таким образом, если MACRO уже определен (через параметр командной строки), он не будет переопределен и не приведет к ошибке.

8 голосов
/ 19 октября 2010

Параметры командной строки применяются перед любой строкой, прочитанной из файла. Содержимое файла применяется в указанном порядке. В общем случае вы получите по крайней мере предупреждение, если какой-либо макрос будет переопределен независимо от того, задействована ли командная строка. Предупреждение может быть отключено, если переопределение не имеет значения, возможно, потому что оба определения идентичны.

Правильный способ ответить на такой вопрос - создать небольшой тестовый пример и попробовать его. Например, в q3965956.c введите следующее:

#define AAA 2
AAA

и запустите его через препроцессор C, возможно с gcc -E:

C:>gcc -DAAA=42 -E q3965956.c
# 1 "q3965956.c"
# 1 ""
# 1 ""
# 1 "q3965956.c"
q3965956.c:1:1: warning: "AAA" redefined
:1:1: warning: this is the location of the previous definition

2

C:>

Из вывода видно, что макрос расширился до значения, заданного #define в файле. Кроме того, из последовательности директив # видно, что как встроенные определения, так и командная строка обрабатывались до любого содержимого строки 1 q3965956.c.

4 голосов
/ 19 октября 2010

Определения хранятся в том порядке, в котором их видит компилятор, и когда компилятор встречает новый макрос с тем же именем, он перезаписывает предыдущий макрос новым (по крайней мере, в случае с gcc). GCC также предупредит вас, когда это произойдет.

4 голосов
/ 19 октября 2010

Вы получите ошибку для переопределения макроса. Очевидно, что -D будет определено первым (до синтаксического анализа исходного файла, а не после него), иначе это будет бесполезно. #define - это переопределение.

1 голос
/ 19 октября 2010

инструкция гласит: сначала все -D и -U оцениваются по порядку, а затем все -включает (в разделе -D)

лучший способ: попробуйте.

...