У меня есть основной файл:
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
Я создаю его с помощью make файла, который выглядит так:
Makefile:
all : a
./a
a : main_a.o shared.o
gcc -o [email protected] $^
%.o : %.c
gcc -c $<
Однако это печатает
i is: 0
Теперь я задаюсь вопросом: почему возникает ошибка при компиляции совместно используемого модуля? Я знаю, что основной модуль скомпилирован первым, поэтому определение должно быть разрешено скомпилированным временем. Компиляция.
У меня есть подозрение, что препроцессор может запускаться в начале каждой сборки модуля, а не только в начале проекта. Если это правильно, есть способ скомпилировать более одного модуля за раз, чтобы использовать препроцессор, как я пытаюсь сделать выше?