变量类型及作用域
关键字 | 名称 | 备注 | 举例 |
auto | 自动变量 |
| void func(void) { auto int i = 0; ... } |
extern | 外部变量 |
| extern int a = 0; int b = 1; void func(void) { ... } |
register | 寄存器变量 |
| void func(void) { register int i = 0; while (i++ < 100) { ... } } |
static | 静态变量 |
| void func(void) { static int i = 5; printf("%d\n", i); i++; } 第一次:5 第二次:6 |
宏定义及位操作
宏定义用下面的格式来实现,它具有(a). 使得程序便于修改;(b). 提高程序运行效率;(c). 增加程序可读性等优点。在编译过程中,宏在预编译阶段会被展开。
#define 宏名[(参数)] [宏体]
以下是几个用宏定义实现的位操作。
// 把data的第n位置位
#define SET_BIT(data, n) (data | (1 << n))
//把data的第n位清零
#define CLR_BIT(data, n) (data & ~(1 << n))
//把data的第n位反转
#define INV_BIT(data, n) (data ^ (1 << n))
关键字volatile
volatile的本意是易变的,可用于修饰变量,提醒编译器它后面所定义的变量随时都有可能改变,编译器不应对它进行优化或者使用缓存的值,而是每次都从对应的内存地址里面读取它的值。在嵌入式开发中,一般用于修饰指向寄存器的变量。比如一个寄存器的地址是0x8000A000,要读取它的值时就可以写成:
int value = *(volatile unsigned int *)0x8000A000;