1.宏定义的格式
#define 标识符 字符串
#define PI 3.1415926
在#include <stdio.h>的下面紧跟写,方便查阅
2.宏定义的作用和意义
就是将一个复杂的或者是常用的字符串用一个简单的标识符进行代替,方便后面编码,提高速度和简洁度。习惯性用大写字母定义,便于与变量名字相区别,但是也可以用小写字母
3.宏展开
就是将原代码中所使用的标识符用原数据进行一个替换
代码解释如下(非正规完整代码,只是解释了宏展开)
#define M (y*y+3*y)
s=3*M+4*M+5*M; //宏展开为 s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y);
4.宏定义可以定义很多东西,不只是数字,还有函数名之类的,只要你想就可以
#define W 我喜新厌旧得厉害,而你是个例外,其他的我从不专一。
#define P printf
#define F "%4d\t%.2f\n"
5.宏定义允许嵌套
#define PI 3.1415926
#define S PI*r*r // PI是上面已经定义了的宏名
6.#undef用来终结宏定义的作用域
也就是此后的标识符都不能表示之前定义的字符串或者数据。
#define PI 3.1415926
#undef PI//格式就是#undef加上之前定义的标识符
7.带参数的宏定义
#define 宏名(形参表) 字符串//格式
#define S(a,b) a*b//定义例子
area=S(3,2);//使用例子
8.宏名和形参之间的括号之间不能有空格,否则将空格以后的字符都作为替代字符串的一部分
#define MAX(a,b) (a>b)?a:b//正确定义
#define MAX (a,b) (a>b)?a:b//错误定义,max和(a,b)之间有空格
9.宏定义中的形参是标识符,语句中的实参可以是表达式
#define SQ(y) (y)*(y)
sq=SQ(a+1); //宏展开为 sq=(a+1)*(a+1);
10.在宏定义中,形参通常要用括号括起来以避免出错,甚至在整个字符串外面加一个括号
#define SQ(y) y*y//错误定义
#define SQ(y) (y)*(y)//正确定义
sq=SQ(a+1);//宏展开后为:sq=a+1*a+1;
11.在源程序中用双引号引起来的字符串内,与宏名相同的字符不进行替换
printf("PI\n"); //PI在双引号内,不进行宏展开
printf("%f\n",PI); //进行宏展开
12.哪些听起来牛逼但是自我感觉一般没啥d用的注意事项
- (1)宏不是变量,不能存数据,也没有数据类型
- (2)宏定义与变量定义不同,它只作字符串替换,不分配内存空间
- (3)宏名习惯上用大写字母表示,以便与变量名相区别,但也允许用小写字母
- (4)宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串替换宏名,这只是一种简单的源程序代码的替换
- (5)字符串中可以包含任何字符,预处理程序不作任何正确性检查。只有在编译已经预处理后的源程序时才能发现
- (6)字符串中可以包含任何字符,预处理程序不作任何正确性检查。只有在编译已经预处理后的源程序时才能发现