У меня есть основной файл, например, так:
main_a.c:
#define MAIN_A
#include <stdio.h>
#include "shared.h"
extern int i;
int main() {
printf("i is: %d\n", i);
return 0;
}
Я хочу использовать define в shared.h, например, так:
shared.h
#if defined(MAIN_A)
# define A
#endif
Таким образом, я могу объявить переменную в зависимости от наличия или отсутствия основного файла, например, так:
shared.c
#include "shared.h"
#if defined(A)
int i = 1;
#else
int i = 0;
#endif
Я собираю его с помощью makefile, который выглядит так:
Makefile:
all : a
./a
a : main_a.o shared.o
gcc -o $@ $^
%.o : %.c
gcc -c $<
Однако это печатает
i is: 0
Теперь мой вопрос: почему это define, кажется, теряется, когда я компилирую общий модуль? Я знаю, что сначала компилируется основной модуль, поэтому определение должно быть решено к моменту компиляции shared.c.
У меня есть подозрение, что препроцессор может запускаться в начале сборки каждого модуля, а не только в начале проекта. Если это так, есть ли способ компилировать более одного модуля за раз, чтобы использовать препроцессор, как я пытался сделать выше?