C++-如何在C/C++中更好的使用宏定义?

C++-如何在C/C++中更好的使用宏定义?

泛泛之交 发布于 2017-02-25 字数 114 浏览 1229 回复 5

之前有同学问宏定义的问题,我想就这个问题引申下,如何在C++中更好的使用宏定义,以及如何避免宏安全性和高效性?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

想挽留 2017-07-21 5 楼

c++已经提供了inline机制,执行效率跟c中宏效率一样高效,何不替代呢?
c++ inline 机制有完整的数据类型检查,这是c所固有缺陷的。

偏爱自由 2017-05-13 4 楼

一般在cpp中不提倡用宏的。
可以使用const代替一般的常量定义。对于一些函数,如果需要高效率的话,可应考虑inline关键字。
当然对于宏的使用来说,主要注意编译器的替换过程就行。编译器在编译阶段会进行宏替换,替换过程也就是仅仅的字符替换而已,所以需要注意一些“边界”情况,合理的使用括号可以减少很多的错误。

虐人心 2017-05-01 3 楼

1.求值宏要用括号括起来,避免产生二意,如

#define VALUE 1+2

调用:

m = VALUE*3;

展开后为:

 m = 1+2*3;

显然与原意不符,所以应将VALUE宏定义为:

 #define VALUE (1+2)

2.对于带参数的宏,在宏体中引用宏参数时,最好也把参数用括号括起来,否则会产生歧义。比如:

 #define FOO(dat,n) (dat<<n)
若有如下引用:
dat = FOO(dat,4-1);
展开形式为:
dat = dat<<4-1;
由于<<的优先级比-高,首先计算dat<<4,这显然与愿意不符。安全的定义为:
#define FOO(dat,n) (dat<<(n))

3.避免多次求值,应定义一个本地变量暂存所有会被引用多次的宏参数。如max()宏的安全定义为:

 #define max(x, y) ({
typeof(x) _max1 = (x);
typeof(y) _max2 = (y);
(void) (&_max1 == &_max2);
_max1 > _max2 ? _max1 : _max2; })

但若将max()宏定义为这样:

 #define max(x, y) ({
x > y ? x : y })

这个max()便不安全了,x,y被多次求值。例如以如下方式调用:

 max(foo(),5);
max(x++,y++);

这会使foo()函数被调用两次,x被++两次,y被++两次。

类似的,也要注意不可在某些情况下不求值。

4.对于非求值的宏,即代码块宏,用do {....}while(0)包围代码块,防止产生意外代码。
倘若使用{}包围代码,可能出现错误代码。比如:

 #define boo()
{
....
}

在if语句中使用它,

 if(x)
b00();
else
...

然而上述代码不能如预期的工作,展开后为

 if(x)
{
....
}
;
else
...

可见多出了一个';',但使用do...while(0)不会出现此问题。
do...while(0)似乎多了一个不必要的循环,不过编译器优化时会识别。

do...while(0)另一用处在于避免goto语句的使用,比如:

 do {
if(...)
break;/*不满足要求跳出*/
.....

if(...)
break;/*不满足要求跳出*/
.....

return;/*成功*/
}while(0)
..../*不满足后的处理*/

瑾兮 2017-04-29 2 楼

在C++中一般是不提倡使用宏的。你这个问题该个提法:什么情况下必须用宏而C++却没有提供替代的方式?

瑾兮 2017-03-03 1 楼

函数的话用inline比较好