Параметры командной строки применяются перед любой строкой, прочитанной из файла. Содержимое файла применяется в указанном порядке. В общем случае вы получите по крайней мере предупреждение, если какой-либо макрос будет переопределен независимо от того, задействована ли командная строка. Предупреждение может быть отключено, если переопределение не имеет значения, возможно, потому что оба определения идентичны.
Правильный способ ответить на такой вопрос - создать небольшой тестовый пример и попробовать его. Например, в 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
.