1.预处理标识符
__FILE__ //当前编译的源文件
__LINE__ //文件当前所属行号
__DATE__ //文件被编译日期
__TIME__ //文件被编译时间
# //将其后的宏参数进行字符串化操作,简单讲就是在它引用的宏变量左右各加上一个双引号
## //将其两边符合连接成一个符号
eg:#define CAT(STR1,STR2)\
STR1##STR2
printf("%d\n",CAT(aa,bb));
2.宏和函数的区别
宏是类型无关,可以频繁的用于执行简单的计算。函数不行。
eg: #define MALLOC(n,type) \
((type *)malloc((n)*sizeof(type)))
int *pi=MALLOC(25,int);
//int *pi=((int*)malloc((25)*sizeof(int)));
区别:(1)每使用一次,宏代码就插入到程序中一次,代码长度将增加;函数中代码只出现在一个地方,使用时,调用即可。
(2)宏的执行速度更快;函数存在函数调用/返回的额外开销。
(3)宏中邻近的操作符优先级会产生不可预料的结果。加do{}while(0);函数表达式求值结果更容易预测。
(4)参数每次用于宏定义时,都将重新进行求值,参数的副作用会带来不可预料的结果。函数参数则只在被调用时求一次值。
(5)宏与类型无关,函数的参数是与类型有关的。
3.编译链接的整个过程及每个过程
1.源文件(.c/.cpp)
2.预处理(.i):完成宏替换、头文件展开、去注释、条件编译。
3.编译(.s):生成汇编代码。
4.汇编(.o):将汇编指令转换为二进制。
5.链接:生成可执行程序。