一.宏
- 宏是一种编译预处理命令,根据是否带参数分为无参宏和带参宏
1.无参宏
- 宏名习惯上大写字母表示,和变量名相区别
- 宏定义就是用宏名代替一个字符串,做简单的置换,不做语法检查
- #define命令出现在程序中所有函数外面,有效范围是定义命令之后到本文件结束,但可用#undef终止宏定义的作用域
#define 标识符 字符串
2.带参宏
- 标识符是形式参数
- 也是用字符串代替宏名,形参用实参代替
#define 标识符(标识符1,标识符2...) 字符串
3.带参宏和函数区别
- 调用函数时,先求出实参表达式的值,然后带入函数定义中的形参,而使用带参宏只是进行简单的字符替换,不进行计算
- 函数调用是在程序运行时处理的,分配临时的内存单元,而宏扩展则是在编译之前进行的,展开时不分配内存单元,也不进行值的传递,没有返回值概念
- 对函数形参和实参都要定义类型,类型一致,如不一致应进行类型转换,而宏不存在类型问题,宏名无类型,参数也无类型,一个符号代表,展开时带入指定字符即可
- 调用函数只能得到一个返回值,宏可以得到几个结果
5.题库
- c语言编译系统对宏命令是在对源程序中其他成分正式编译之前进行处理的
- c语言预处理命令不是c语言文本的一部分(c语言文本不包含函数和预处理命令)
- 预处理#include <stdio.h>不是非必须,用到输出输入才需要,预处理命令不一定位于c语言首部
#define N 3
#define Y(n) ((N+1)*n)
//z=2*(N+Y(5+1));注意这里答案是48,不是54,5+1是字符串,把n替换成了5+1,而不是把n替换成6
二.条件编译
- c中所有行都参加编译过程,有时出于代码优化,希望对其中一部分内容只是在满足一定条件时才进行编译,形成目标代码
三.文件包含
- 就是预处理,一个文件中将另一个文件的全部内容包含进来的处理过程,即将另外的文件包含到本文件中
- 提供#include编译预处理命令实现文件包含操作
#include <包含文件名> 或者#include "包含文件名"
四.位段
- 又称为位域,没有专门的位段类型,位段定义要借助于结构体,以二进制为单位定义结构体成员所占存储空间
- 从而就可以按"位"来访问结构体中的成员,这一功能很有用
- 某些设备间传输信息是以字节为单位的,字节中的不同位代表不同的控制信号,常常需要单独置值或清零
- 没有逻辑量,0代表假,非0代表真,实际只要一个二进制位可存储
- 用位段可在一个字节中存放几个逻辑量
- 数据类型只能是unsigned,short unsigned或者int型,整数需要指出位段长度
数据类型 成员名 : 整数
struct packed_data{
unsigned a:1;
unsigned b:2;
unsigned c:3;
}//虽占位不同,但共占1个字节