【问题标题】:c token pasting (concatenation) with empty string带有空字符串的 c 令牌粘贴(连接)
【发布时间】:2016-05-10 19:46:09
【问题描述】:

我正在尝试将宏用于 c 代码。 但是,我坚持使用令牌连接

我有以下变量。

A, aA, bA, cA ...

而且,所有这些变量都用于同一个函数(情况有点复杂,所以仅仅传递变量是不够的)。

如果我只有

aA, bA, cA

然后,我可以使用下面的宏。

#define CALL_FUNCTION(GROUP) \
     FUNCTION(GROUP##A);

但是,因为

A

我不能再使用上面提到的宏了。 我试过了,

#define CALL_FUNCTION(GROUP) \
     FUNCTION(GROUP##A);

FUNCTION(NULL);    
FUNCTION(a);
FUNCTION(b);
FUNCTION(c);

但实际上,NULL 不是空字符串,它不起作用。

FUNCTION("");    

也没有用。

还有其他方法,例如,

#define CALL_FUNCTION(GROUP) \
    if(GROUP == NULL)\
        FUNCTION(A);\
    else\
        FUNCTION(GROUP##A);

但是,在这种情况下,我需要多写几行。 就我而言,它会导致更多代码。

我用谷歌搜索了很多,但我无法解决。 有谁知道如何用空字符串标记粘贴?

谢谢

【问题讨论】:

    标签: c macros concatenation token


    【解决方案1】:

    传递一个空参数,它将有效地将任何内容与A 连接起来,只产生A

    #define CALL_FUNCTION(GROUP) \
         FUNCTION(GROUP##A);
    
    CALL_FUNCTION() // expands to FUNCTION(A);
    CALL_FUNCTION(a) // expands to FUNCTION(aA);
    

    你可以see this work live

    需要注意的是,当您调用CALL_FUNCTION() 时,您不会像处理函数那样传递零参数。相反,您传递一个参数 - 空。同样,MACRO(,) 使用两个空参数调用 MACRO。碰巧与空的连接行为是您想要的。

    【讨论】:

      【解决方案2】:

      您只需要第二个不带参数的宏:

      #define CALL_FUNCTION() \
           FUNCTION(A);
      
      #define CALL_FUNCTION(GROUP) \
           FUNCTION(GROUP##A);
      

      例子:

      #include <stdio.h>
      
      #define FUNCTION(x)           printf( # x "\n" )
      #define CALL_FUNCTION()       FUNCTION(A)
      #define CALL_FUNCTION(GROUP)  FUNCTION(GROUP##A)
      
      int main(void) {
          CALL_FUNCTION();
          CALL_FUNCTION(a);
          CALL_FUNCTION(b);
          CALL_FUNCTION(c);
          return 0;
      }
      

      输出:

      A
      aA
      bA
      cA
      

      【讨论】:

      • 你的例子给了我一个warning关于被重新定义的宏。幸运的是,重新定义处理了空参数和非空参数。
      猜你喜欢
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 2012-10-29
      • 1970-01-01
      相关资源
      最近更新 更多