#define scope в нескольких файлах

У меня есть основной файл, например, так:

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.

У меня есть подозрение, что препроцессор может запускаться в начале сборки каждого модуля, а не только в начале проекта. Если это так, есть ли способ компилировать более одного модуля за раз, чтобы использовать препроцессор, как я пытался сделать выше?

13
задан Brian Tompsett - 汤莱恩 28 November 2015 в 23:47
поделиться