C基础拾遗
C预处理器和C库
#define
#define由3部分组成。第1部分是#define指令本身。第2部分是选定的缩写,也称为宏。有些宏代表值(如本例),这些宏被称为类对象宏(object-like macro)。宏的名称中不允许有空格,而且必须遵循C变量的命名规则:只能使用字符、数字和下划线(_)字符,而且首字符不能是数字。第3部分(指令行的其余部分)称为替换列表或替换体,一旦预处理器在程序中找到宏的示实例后,就会用替换体代替该宏。
在#define中使用参数
SQUARE宏的定义如下:
#define SQUARE(X) XX
这里,SQUARE 是宏标识符,SQUARE(X)中的 X 是宏参数,XX 是替换列表。程序清单 16.2 中出现SQUARE(X)的地方都会被XX替换。这与前面的示例不同,使用该宏时,既可以用X,也可以用其他符号。宏定义中的X由宏调用中的符号代替。因此,SQUARE(2)替换为22,X实际上起到参数的作用。
变参宏:……和_ VA_ARGS _
条件编译
1.#ifdef、#else和#endif指令
#ifdef指令说明,如果预处理器已定义了后面的标识符(MAVIS),则执行#else或#endif指令之前的所有指令并编译所有C代码(先出现哪个指令就执行到哪里)。如果预处理器未定义MAVIS,且有 #else指令,则执行#else和#endif指令之间的所有代码。
#ifndef指令与#ifdef指令的用法类似,也可以和#else、#endif一起使用,但是它们的逻辑相反。
预定义宏
结构和联合
在C中,使用结构可以把不同类型的值存储在一起。
C提供了两种类型的聚合数据类型,数组和结构。数组是相同类型的元素的集合,它的每个元素是通过下标引用或指针间接访问来选择的。
数组元素可以通过下标访问,这只是因为数组的元素长度相同。但是,在结构中情况并非如此。由于一个结构的成员可能长度不同,所以不能使用下标来访问它们。相反,每个结构成员都有自己的名字,它们是通过名字访问的。
结构
结构声明
结构成员
结构成员的直接访问
结构成员的间接访问
结构的自引用
联合
联合的所有成员引用的是内存中的相同位置。当你想在不同的时刻把不同的东西存储于同一个位置时,就可以使用联合。