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
  • 宏定义可以嵌套
  • 字符串" "中永远不包含宏
  • 宏定义不分配内存,变量定义分配内存。
    宏定义会在编译时被替换从而消除。