首页 > 学院 > 开发设计 > 正文

c语言基础学习

2019-11-08 18:35:15
字体:
来源:转载
供稿:网友

编译预处理与位运算

编译预处理

作用 :对源程序编译之前做一些处理

种类 : 宏定义 #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.带参的宏和带参函数很相似,但有本质上的不同
/ 带参宏 函数
处理时间 编译时 程序运行时
参数类型 无类型问题 定义实参,形参类型
内存占用 不分配内存 分配内存
运行速度 不占运行时间 调用返回占用时间
条件编译 #ifdef 如果已定义#ifdef 标识符 程序段1#else 程序段2#endif

当所指定的标识符已经被#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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表