【问题标题】: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 ;
}

【问题讨论】:

    标签: c macros concatenation preprocessor-directive


    【解决方案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 ;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-12-09
        • 2011-06-06
        • 2012-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多