C++之宏定义

来源:互联网 发布:庞珣 知乎 编辑:程序博客网 时间:2024/05/21 13:35

1.宏定义需要注意到问题:

1、宏定义为#define ,不带分号。

2、预处理器将会把宏定义中的常数表达式计算成组中结果。

3、宏定义的整体和每一个参数都要用括弧。

因为宏定义中无论是整体还是参数都是在程序中直接展开(常数表达式计算出值后展开),所以必须加括弧。

比如#define SQUAR(n) n*n就会有问题,比如带入一个表达式:SQUARE(3+2);展开就是3+2*3+2,并非我们需要的结果。如果代入SQUARE(3+2)*5;展开就是3+2*3+2*5,面目全非了,这就是展开的问题所在。

所以宏定义为#define SQUARE(n) ((n)*(n))就好了。注意SQUARE和(之间不能有空格,宏定义的宏名和定义体分割点在第一个空格处。这样定义后,如果代入SQUARE(3+2)*5;展开就是((3+2)*(3+2))*5,完全没有问题。

上面的例子似乎不能证明整体的括弧的作用,我们看这个例子:

#define MUL_ADD(m,n) (m)+(n),能看出问题了吧,这个时候就会出问题了,其实根本就在于运算符号的优先级问题。比如带入MUL_ADD(3,2)*3;展开后就是3+2*3。

综合以上,宏的无论是参数还是整体定义都要用括弧小心的括起来。这样能保证展开还是一个整体而不受外部优先级更高的运算符干扰。

0 0