第三章 预处理
注释先于预处理指令被处理,所以无法用宏定义注释
宏定义表达式时,每个参数都加括号,避免不必要的错误
宏定义时: SUM (x) 和SUM(x)不同
使用时: SUM(x) 和SUM (x)一样
#define X 3
#define Y X*2
#undef X
#define X 2
int a = Y;
printf(“%d\n”, a);
结果为4;
结构中数据定义:由小到大
eg.
struct ss{
int I;
short a;
char b;
};
涉及到字节对齐问题
#pragma pack(n) 编译器将按照n个字节对齐
#pragma pack() 编译器将取消自定义字节对齐方式
对齐规则:
按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数中较小的一个对齐。
字节对齐三点:
首先,每个成员分别按自己的方式对齐,并能最小化长度。
其次,复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。
然后,对齐吼的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。
#运算符
#define SQR(x) printf(“The ad x is %d\n”, ((x)*(x)));
SQR(8); 输出为The ad x is 64
引号中的字符x被当成普通文本来处理,而不是被当做一个可以被替换的语言符号。
#define SQR(x) printf(“The ad “#x” is %d\n”, ((x)*(x)));
SQR(8);
输出为:
The ad 8 is 64
##运算符 –粘合剂
#define XNAME(n) x##n
XNAME(8) -> x8