我使用##
运算符连接两个数字。我使用变量时代码会出错,但在直接输入时工作正常。
给出错误。
[错误]' xy'未申报(首次使用此功能)
#include<stdio.h>
#define join(a, b) a##b ;
int main()
{
int x = 10;
int y = 5;
int res ;
res = join(x, y);
printf("%d",res) ;
return 0 ;
}
工作正常:
#include<stdio.h>
#define join(a, b) a##b ;
int main()
{
int res ;
res = join(99, 10);
printf("%d",res) ;
return 0 ;
}
答案 0 :(得分:4)
好吧,预处理器MACROS是文本替换,因此在你使用变量的情况下,在预处理后你的代码看起来像
res = xy;
现在这个xy
是代码中未定义的标识符。
OTOH,当你传递整数常量时,你的代码看起来像
res = 9910;
完全有效。
详细说明##
运算符的工作情况,引用C11
,章节§6.10.3.3(强调我的)
在类似函数的宏的替换列表中,参数紧跟在
##
预处理标记之前或之后,该参数由对应的参数的预处理标记序列替换; [...]
答案 1 :(得分:2)
##
预处理运算符执行标记粘贴。并且在编译时检查令牌。
您认为res = join(x, y);
应该是什么意思?
res = xy;
C
编译器应该给出编译错误。
这res = join(99, 10);
表示
res = 9910;
哪种在C语法中有效。还要记住,宏不是类型安全的,所以使用这样的强制转换:
res = (int) join(99, 10);
如果您在此之前声明xy
,则您的代码有效:
#include<stdio.h>
#define join(a, b) a##b ;
int main()
{
int xy = 100;
int res ;
res = (int) join(x, y);
printf("%d",res) ;
return 0 ;
}