У меня есть основной файл, как так:#define сферы в нескольких файлах
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;
}
Я хочу использовать определение в shared.h так:
совместно .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 [email protected] $^
%.o : %.c
gcc -c $<
Однако это печатает
i is: 0
Теперь мой вопрос: почему это tha t при попытке скомпилировать общий модуль? Я знаю, что основной модуль скомпилирован первым, поэтому определение должно быть разрешено к моменту компиляции времени.
У меня есть подозрение, что препроцессор может запускаться в начале каждой сборки модуля, а не только в начале проекта. Если это правильно, есть способ скомпилировать более одного модуля за раз, чтобы использовать препроцессор, как я пытаюсь сделать выше?
Какой '# define' MAIN_A или A? –
+1 за то, что вы собрались вместе, прежде чем публиковать ... –
Это лучший ответ: http://stackoverflow.com/a/2649569/243712 – poolie