1、概述
C++中出了const关键字以后,宏定义常量的功能已经不在被推荐使用。这使 得宏似乎没有了用武之地。实际上,宏还可以做很多事情,笔者也难以全部列举 。这里,仅仅列举几个典型的用法,希望大家能够从中获益。
2、实现多环境兼容
常见的情况是,我们实现了一个函数,希望它只在某种编译条件满足是被编译和使用。例如,我希望在源码中插入调试语句,以便以Debug方式运行时能够 通过调试信息观察程序运行情况。但是,在产品发售给用户时,我又希望这些调 试信息不要输出,以降低代码尺寸,提高运行性能。 这一问题的解决方法就是 使用宏。根据条件编译指令,对于不同的编译条件,提供不同的实现。例如:我们希望在特定的位置向日志中写入当前行号和文件名,以判断对应代码是否被执 行到,可以使用下面的宏:
#ifdef _DEBUG
#define TRACE_FILE_LINE_INFO() do{\
CString str;\
str.Format(_T("file=%s,line=%u\r\n",__FILE__,__LINE__);\
CFile file("logfile.txt");\
file.Write(str,str.GetLength());\
}while(0)
#else
#define TRACE_FILE_LINE_INFO()
#endif
上面这段代码通过#ifdef #else #endif三个条件编译 指令,根据_DEBUG定义情况(该宏用于区分DEBUG版本和Release版本),决定了 具体的TRACE_FILE_LINE_INFO宏函数的实现。使用者可以用如下方法使用
TRACE_FILE_LINE_INFO();//这里显示行号和文本信息
当然 ,采用其他方式也可以实现这一功能,但是使用宏有以下特殊好处: 只有需要 的代码才会被编译,减少了符号表的尺寸,也减少了代码尺寸 宏在编译时被展 开,因此用于表示代码位置的__FILE__,__LINE__宏可以起作用,如果用函数实 现,这两个宏则不能起作用。