宏 用于预处理,预处理不是编译,而是编译前对源文件文本的处理,得到真正待编译的文本;
常用的宏:
#define :这个宏一般用于定义一个别名,然后预处理时把别名替换成真正的名称,注意这只是文本层面的替换;
这个宏常用于定义常量;
#define PI 3.1415
#define ERROR_POWEROFF -1
这样其实也起到注释,增强代码可读性的作用;不然对于魔鬼数字-1,没人能知道这代表什么。
#define宏除了可以用来定义常数之外,还可以定义字符串,尤其是路径;
#define宏还可以用于定义表达式
#define SQR(x) x*x
条件编译宏:
#ifdef
#else
#endif
这块不作过多介绍了;
文件包含:
#include <filename> //预处理到系统规定的路径中去获得这个文件
#include "filename" //应该先在当前目录中查找,如果没找到,则按系统指定的路径查找。
其他宏以后再讨论;
===============================================
常量:
定义常量有两种方法:
C++ 用 const
C语言用 #define
const定义常量有以下好处:
1)const常量有数据类型,宏常量没有数据类型。编译器可以对前者进行类型安全检查,而后者只能进行字符替换。
2)集成化调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
#define 定义的常量是全局的。
如果类中要定义常量,应该使用const修饰数据成员。
但是要注意const数据成员只在某个对象的生存期内是常量,而对于整个类而言是可变的;
类可以创建多个对象,不同对象的const值可不同。
所以不能再类声明中初始化const数据成员。
class A{
const int SIZE = 100; //这是错误的
int array[SIZE]; //也是错误的,SIZE是未知的
}
const数据成员初始化只能在类构造函数的初始化表中进行;