十三、C语言预处理
13.1 从.c文件编译到.exe文件
预编译阶段进行代码的文本操作,例如:#include头文件的包含、删除注释、#define宏定义替换
test.c经过预编译产生test.i
编译阶段将C语言代码编译成汇编代码,操作有:语法分析、词法分析、语义分析、符号汇总
test.i经过编译阶段产生test.s
汇编阶段形成符号表,并将汇编翻译成二进制指令 ,test.s经过汇编阶段生成test.o
13.2 预定义符号
13.3预编译符号
13.3.1 #define
1.定义标识符
2.宏定义
带参宏定义
注意:宏是将参数进行替换而不是传参
#define MUL(x) x*x
void main()
{
int a = MUL(5+1);
printf("%d", a);
}
代码运行结果是11而不是36,因为MUL(5+1)是被替换成5+1*5+1,所以得到5+5+1=11
所以用宏进行数值运算时最好带上括号
13.3.2 #
将宏定义中的参数转变为字符串,如:
#define print(x) printf("the value of "#x" is %d",x)
void main()
{
int a = 10;
print(a);
}
此时printf里的#x等价于"a",打印的结果是
13.3.3 ##
将 ## 两端的符号拼接成一个符号
#define print(x,y) printf("the value is %d",x##y)
void main()
{
int abcd = 10;
print(ab,cd);
}
#define宏定义和函数很相似,宏的优势:1.宏的效率更高.因为调用函数需要传参,返回等等动作,但#define在预编译阶段就会被编译器全部替换,没有多余的动作过程,代码运行更快;2.宏可以不考虑数据类型,甚至可以传类型
宏的劣势:
13.4命令行定义
13.5条件编译指令
13.6 #include
#include可以使别的文件被编译,编译时首先删除#include这代码,然后用相应文件内容替换
头文件包含方式
头文件被重复引用的解决方法:
1.用条件编译
#ifndef __TEST_H__
#define __TEST_H__
#endif
2. #pragram once
#pragram once