第三章 预处理

注释先于预处理指令被处理,所以无法用宏定义注释

宏定义表达式时,每个参数都加括号,避免不必要的错误

宏定义时: 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