第3章 预处理

1.下面两行代码都是错的。因为注释先于预处理指令被处理,当这两行被展开成“//……”和“/*……*/”时,注释已处理完毕,所以出现错误

#define BSC //
#define BMC /*
#define EMC */

BSC my single - line comment
BMC my multi - line comment EMC

【规则 3-1】函数宏的调用不能缺少参数,如果此函数宏有参数的话。

【规则 3-2】在定义函数宏时,每个参数实例都应该小括号括起来,除非它作为#或##的操作数。

2.条件编译

  • 第1种形式
#ifdef  标识符
程序段 1
#else
程序段 2
#endif

 

  • 第2种形式
#ifndef  标识符
程序段 1
#else
程序段 2
#endif

 

  • 第3种形式
#if 常量表达式
程序段 1
#else
程序段 2
#endif

3.#error预处理

编译程序时,只要遇到#error就会生成一个编译错误提示消息,并停止编译。语法格式为

#error error-message

4.#line预处理

#line的作用是改变当前行数和文件名称

(作用:编译器对C源码编译的过程中会产生一些中间文件,通过这条指令,可以保证文件名是固定的,不会被中间文件代替,有利于分析)

5.#pragma message

能够在编译消息输出窗口中输出相应的信息。

#pragma message(“消息文本”)

6.#pragma pack 和内存对齐问题

  对 字,双字和四字来说,自然边界分别是偶数地址,可以被4整除的地址和可以被8整除的地址。原因在于为了访问未对齐的内存,处理器需要做两次内存访问;然而对于对齐的内存访问仅需要一次访问。

#pragma pack(n)   //编译器将按照n字节对齐    
#pragma pack()     //取消自定义字节对齐方式
  • 每个成员分别按自己的方式对齐,并能最小化长度
  • 复杂类型(如结构)的默认对齐方式是他的最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度
  • 对齐后的对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐

7.“#”运算符

 

8.“##”运算符