种类 : 宏定义 #define #ifdef #ifndef 文件包含 #include 条件编译 #if–#else–#endif等 其他宏定义 #line #error #PRagma
不带参数宏定义 一般形式 : #define 宏名 [宏体] 功能 : 用指定的宏名代替宏体
宏定义的规则 1.宏定义不是c语句,不必在行末加分号 2.在进行宏定义时可以引用自己已定义的宏名,可以层层替换。 3.宏定义只做字符替换,不分配内存空间 4.宏名的有限范围为宏定义到本源文件结束 5.宏定义只做简单的替换不做正确性检查#define R 3.0#define PI 3.14#define L 2*PI*R带参数宏定义一般形式 : #define 宏名(参数表) 宏体 宏展开 :形参用实参换,其他字符保留
宏定义特点 : 1.带参数宏定义中,宏名与形参表之间不能有空格出现,例如,#define MAX(a,b) (a>b)?a:b。其中MAX与(a,b)之间不能有空格 2.在带参宏定义中,形参表示不分配内存单元,因此不必作类型定义。 3.带参的宏和带参函数很相似,但有本质上的不同/ | 带参宏 | 函数 |
---|---|---|
处理时间 | 编译时 | 程序运行时 |
参数类型 | 无类型问题 | 定义实参,形参类型 |
内存占用 | 不分配内存 | 分配内存 |
运行速度 | 不占运行时间 | 调用返回占用时间 |
当所指定的标识符已经被#define命令定义过,注意只是标识符被定义过即可,不管它是否成立。则在程序编译阶段之编译程序段1,否则只编译程序段2。 2.#if 如果定义表达式成立
#if 常量表达式 程序段1#else 程序段2#endif如果常量表达式的值为真(非0),则对程序段1进行编译,否则对程序段2进行编译。
3.# 字符串化操作符
#define mkstr(s) #sint main(void){ printf(mkstr(i like c)); return 0;}预处理程序将 printf(mkstr(i like c)); 变成 printf(“i like c”);
4.## 可以把两个独立的字符串连接成一个字符串
#define SORT(X) sort_function##Xint mian(void){ char *array; int elements, element_size; SORT(3)(array, elements,element_size);}预处理程序将SORT(3)转换为sort_function3
新闻热点
疑难解答