使用`##`operator

时间:2015-08-06 08:57:12

标签: c macros concatenation preprocessor-directive

我使用##运算符连接两个数字。我使用变量时代码会出错,但在直接输入时工作正常。

给出错误。

  

[错误]' 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 ;
}

2 个答案:

答案 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 ;
}