第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.“##”运算符