在C++中使用宏

Using macros in C++

本文关键字:C++      更新时间:2023-10-16
#include<iostream>
#include<conio.h>
#define test(X) X*X
using namespace std;
int main()
{
int i=3,j;
j= test(++i);
cout<<j;
getch();
}

我原本期望输出20(4*5),但我得到的值是25。有人能指出我误解的地方吗。

谢谢。

语句

j= test(++i); 

将调用未定义的行为。在扩展宏test(X)时,它看起来像

j = ++i * ++i; //i is modifying twice.   

这里CCD_ 2在两个序列点之间进行两次修改。

C-FAQ-3.8:

在上一个和下一个序列点之间,对象的存储值应通过表达式的求值最多修改一次。此外,应仅访问先前的值以确定要存储的值。

C11:3.4.3;未定义的行为:

行为,在使用不可移植或错误的程序结构或错误的数据时,本国际标准未对提出任何要求

注意可能的未定义行为包括完全忽略情况和不可预测结果,在翻译或程序执行过程中以文档化的方式表现环境(有或没有发出诊断消息),以终止翻译或执行(伴随诊断消息的发布)。

宏可以有效地复制/粘贴。因此,它变成了:

++i * ++i

不要把它看作一个函数。而且,这是未定义的行为,因为它在序列点之间修改了i两次。

此外,宏也是邪恶的。不要使用它们。(对于讨厌的悲观主义者来说:宏很少是必要的邪恶。然而,它们仍然是邪恶的)

相关文章:
  • 没有找到相关文章