使用 `##` 运算符的连接问题

Posted

技术标签:

【中文标题】使用 `##` 运算符的连接问题【英文标题】:Issue with concatenation using `##` operator 【发布时间】:2015-08-06 08:57:11 【问题描述】:

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

给出一个错误。

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

【问题讨论】:

【参考方案1】:

好吧,预处理器宏是文本替换,所以如果你使用变量,预处理后你的代码看起来像

res = xy;

现在这个xy 在您的代码中是一个未定义的标识符。

OTOH,当您传递整数常量时,您的代码看起来像

res = 9910;

这是完全有效的。

为了详细说明 ## 运算符的工作原理,引用 C11,第 §6.10.3.3 章(强调我的

在类函数宏的替换列表中,参数前面或后面紧跟着一个##预处理标记,该参数被替换为对应参数的预处理标记序列; [...]

【讨论】:

【参考方案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 ;

【讨论】:

以上是关于使用 `##` 运算符的连接问题的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 连接运算符

在 Python 中使用 + 和 += 运算符进行连接 [重复]

使用 + 运算符的字符串连接 [重复]

C 连接运算符与 + 运算符

为啥 C 在使用条件运算符时不允许连接字符串?

连接运算符 (+) 与 concat() [重复]