在写一个代码生成可执行文件的过程需要经过编译和链接,编译又要经过三部:预处理,编译,汇编。
#define定义的变量和宏就是在预处理阶段会处理的。
注意:在#define定义的宏或变量后面不能加分号(;)
例如:
2.带副作用的宏参数
在给宏传参的时候我们尽量避免传一些前缀或后缀++ --这样的参数,这是一些带有副作用的参数
3.函数与宏的区别:
4.宏替换的规则
在程序中扩展#define定义符号和宏时,需要涉及⼏个步骤。
1. 在调⽤宏时,⾸先对参数进⾏检查,看看是否包含任何由#define定义的符号。如果是,它们⾸先被替换。
2. 替换⽂本随后被插⼊到程序中原来⽂本的位置。对于宏,参数名被他们的值所替换。
3. 最后,再次对结果⽂件进⾏扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。
注意:
1. 宏参数和#define定义中可以出现其他#define定义的符号。但是对于宏,不能出现递归。
2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索
6.##运算符的使用
## 可以把位于它两边的符号合成⼀个符号,它允许宏定义从分离的⽂本⽚段创建标识符。 ## 被称
为记号粘合
这样的连接必须产⽣⼀个合法的标识符。否则其结果就是未定义的。
这⾥我们想想,写⼀个函数求2个数的较⼤值的时候,不同的数据类型就得写不同的函数
比如:int int_max(int x, int y) { return x>y?x:y; } float float_max(float x, float y) { return x>yx:y; }
这么写很繁琐我们可以用宏定义来写函数
7.宏定义函数
#define Max(type) type type##_max(type x,type y)\ { \ return x>y?x:y; \ } 这里\为续行符 Max(int) Max(float) Max(char) int main() { printf("%d\n", int_max(5, 9)); printf("%.2f\n", float_max(5.2, 5.32)); printf("%c\n", char_max('p', 'h')); }