【发布时间】:2011-07-05 14:46:14
【问题描述】:
我在其中一个标题中有一些简短的定义,如下所示:
#define ROUND_DOWN(a,b) (a)-(a)%(b)
例如
ROUND_DOWN(178,32) = 160
但是如果我把它传递给它:
ROUND_DOWN(160*2, 32);
然后编译成这样?
(160*2)-(160*2)%(32),
这只是更多的处理,因为它两次 160*2..
我想知道内联函数的行为方式是否相同?例如
inline int RoundDown(int a, int b)
{
return (a)-(a)%(b)
}
160*2 是否会作为 320 存储在“int a”中,然后计算会起作用,还是会与定义的行为相同?
一个更好的例子是调用:
RoundDown((x+x2)*zoom, tile_width);
【问题讨论】:
-
2 * ROUND_DOWN(178, 32)会让事情不再起作用。请改用#define ROUND_DOWN(a,b) ((a)-(a)%(b))(注意额外的括号)。结论:无论如何都不会表现得一样。 -
用你的宏试试
ROUND_DOWN(x++, y),看看会发生什么。 -
@Fred:或者不知道会发生什么,因为 UB 会导致 invisible 恶魔飞出你的鼻子。
标签: c++ c c-preprocessor inline-functions