C++:预处理/宏定义
来自Peter_Matthew的Wiki
#define是C++中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率。
define的剖析
#define命令用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。 该命令有两种格式:一种是不带参数的宏定义,另一种是带参数的宏定义。
不带参数的宏定义
格式:
#define 标识符 一串内容
这里所说的一串内容可以是数字,可以是字符,可以是字符串,可以是表达式,也可以为空,等等,具体是什么要根据你实际需求来确定。
这个预处理的作用是将标识符展开,是一个“换”的作用。
例如,在库文件math.h中,对圆周率Π有着如下定义
#define M_PI 3.14159265358979323846
那么在编译的时候,所有的M_PI都会被替换成3.14159265358979323846
说明:
- 宏名一般用大写
这是为了与一般变量、函数等用名区分开 - 使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。
例如:数组大小常用宏定义
#define MAXN 10005 int a[MAXN],b[MAXN];
- 预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
这也意味着编译错误时的反馈经常显示的与未展开的代码不一样。 - 宏定义末尾不加分号;
与文件包含类似,宏定义也不以分号结束,而是以换行结尾,在同一行的内容都将被视为宏定义的内容。 - 宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
- 可以用#undef命令终止宏定义的作用域
例如
#undef M_PI
- 宏定义可以嵌套
- 字符串" "中永远不包含宏
- 宏定义不分配内存,变量定义分配内存。
宏定义会在编译时被替换从而消除。