30_1.c
#include <stdio.h>
void main(){
#include "30_2.h"
int a= A
#undef A
#define B 200
printf("%d,%d",a,B);
}
30_2.h
#define A 3;
一般把#define和#include放到文件的开头位置,函数的外面。放到函数里面很少见吧。
不过这样做也是符合c语言的语法规则的,因为c语言是支持预处理的,预处理一般进行的是字符串的替换和选择对应的字符串。预处理之后才进行编译。#include "30_2.h"意味着把30_2.h里面的内容包含到30_2.c中的第三行,包含之后#include "30_2.h"会被删除掉,现在语言分析到#define A 3;意味着从第三行开始,所有的A都会被替换为3;, int a=A替换成为了int a=3; #undef A;代表从第五行后,不对A进行替换了。#define B 200意味着从第6行开始将B替换成200.所有的#include,#define,#undef这些预处理符号在预处理之后不会保留.
用gcc -E 30_1.c查看预处理结果,只截取了一部分
void main(){
# 1 "30_2.h" 1
# 4 "30_1.c" 2
int a= 3;
printf("%d,%d",a,200);
}