当我尝试编译它时(我试图理解##在这里做什么),我收到一个错误说:"i2 undedeclarationed"。我没有这个名字的变量,这是我拥有的所有代码。
#include <stdio.h>
#define A(x,y) x##2-y
int main()
{
int i = -1;
int j = -2;
printf("%d n", A(i,j));
return 0;
}
##
简单地表示从两个表达式中形成一个新的预处理器常量("粘贴在一起")。
您的宏将扩展到与i2-j
相同的i##2-j
。您没有称为i2
的内容,这是编译器错误。
经过预处理后,此语句
printf("%d n", A(i,j));
成为:
printf("%d n", i2-j);
如您所见,代码中没有变量i2
。因此,错误。 ##
称为令牌粘贴运算符,它将两个令牌粘贴i
并2
在一起,它变得i2
。
##
连接其操作数。所以对于A(i,j)
,你会得到i##2-y
,在连接后变成i2-y
。而且,正如您所说,您没有在代码中的任何位置定义变量i2
,因此您正确地会得到一个i2
不存在的错误。