使用 `##` 运算符的连接问题
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 ;
【讨论】:
以上是关于使用 `##` 运算符的连接问题的主要内容,如果未能解决你的问题,请参考以下文章