1,问题的提出
a.h 中 #define M 3
b.h 中 #include “a.h”
c.h 中 #include "b.h"
c.c 中 #include “c.h”
那么, c.c 中可以使用宏 M 么?
答:
因为编译和预处理的单位都是一个c语言源文件,先逐条递归刷#include,所以 #define 会随着#include而进入到 c源文件c.c中,然后再从上到下逐条刷#define。
2,具体示例
Makefile
EXE := main
all: $(EXE)
SRC_C := func.c main.c
OBJ_C := $(SRC_C:.c=.i.o)
%.i.o: %.i
gcc $< -c -o $@
%.i: %.c
gcc -E $< -o $@
main: $(OBJ_C)
gcc $^ -o $@
.PHONY: clean
clean:
rm -rf *.o *.i main
constant.h
#define N 7
defs.h
#include "constant.h"
#define K 2
func.c
#include "func.h"
int func(int A, int B)
{
return A + B + M + N + K;
}
func.h
#include "defs.h"
#define M N
int func(int x, int y);
main.c
#include <stdio.h>
#include "func.h"
int main()
{
int x = 3;
int y = 12;
int z = func(x, y);
printf("z = %d\n", z);
return 0;
}
3,预编译效果
gcc -E xx.c -o xx.i