【发布时间】:2011-09-15 14:01:58
【问题描述】:
这里有一些更奇怪的宏行为,我希望有人能阐明:
#define MAX(a,b) (a>b?a:b)
void main(void)
{
int a = 3, b=4;
printf("%d %d %d\n",a,b,MAX(a++,b++));
}
输出为 4 6 5。b 的值增加了两次,但在 MAX 显示其值之前不会增加。谁能告诉我为什么会发生这种情况以及如何预测这种行为? (另一个为什么应该避免使用宏的例子!)
【问题讨论】:
-
有趣,如果你做 MAX(++a, ++b) 会发生什么?我在一个论坛上找到了这个信息:永远不要使用前置或后置增量作为宏的参数,因为宏可能会多次使用该参数。因此,第 2 项应该是“永远不要对函数的参数使用递增或递减”,因为您可能不知道这是否是一个真正的函数,或者它是否作为宏实现。来源:bytes.com/topic/c/answers/…
-
这可能被视为反对使用前置或后置增量的论据。
-
@peko:也就是说,当标准函数被实现为宏时,它们必须对每个参数进行一次准确的评估(7.1.4/1)。此外,标准库总是提供函数以及宏。所以
strlen(++s)只增加一次s,但是如果你想避免宏,你可以写(strlen)(++s),这不是宏信息。第三方库的编写者可能会或可能不会提供这些有用的保证,如果他们提供了他们不会告诉您它们是函数还是宏的“东西”。
标签: c macros undefined-behavior