【问题标题】:How to use ## in a macro?如何在宏中使用##?
【发布时间】:2018-06-19 02:07:03
【问题描述】:

这是一个简单的演示。但是 Xcode 向我显示了错误“粘贴形成的 '->client_port',一个无效的预处理令牌 从宏“PARSE_COLUMN”扩展而来 cfg->##column = 值'

我只想快速为我的结构设置值,'cfg->##column = value'有什么问题

#include <stdio.h>

#define PARSE_COLUMN( column, value ) \
    printf("parse column:%s\n",#column);\
    cfg->##column = value

typedef struct {
    int client_port;
} server_config;

int main(void) {
    server_config *cfg = new server_config;
    PARSE_COLUMN(client_port,123);
    return 0;
}

【问题讨论】:

  • 您认为cfg-&gt;##column 是什么意思? ##(令牌连接)对我来说似乎毫无意义。你的意思是cfg-&gt;column
  • 注意new server_config是C语言的语法错误。

标签: c macros


【解决方案1】:

## 用于连接两个宏参数,例如上面代码中的column##value 将与client_port123 交换。

这里不需要用到,直接写cfg-&gt;column = value即可。

【讨论】:

    【解决方案2】:

    ## 用于将两个有效的预处理器标记连接成一个。 cfg-&gt; 不是有效的预处理器令牌,而是cfg。因此你会得到一个编译器错误。

    在这种情况下,您只需删除 ## 即可:cfg-&gt;column = value

    请注意,像这样的宏通常是不好的做法,最好使用函数。

    【讨论】:

      【解决方案3】:

      ## 用于拆分标记,然后将它们连接起来。

      例子:

      #define A1(name, type)  type name_##type##_type
      #define A2(name, type)  type name##_##type##_type
      
      A1(a1, int);  /*  int name_int_type; */
      A2(a1, int);  /*  int a1_int_type;   */
      

      在宏 A1 中,name_##type##_type 分为 3 个部分:{name_type_type},只有第 2 部分 type 是有效参数,可以替换。

      在宏 A2 中,name##_##type##_type 分为 4 部分:{name_type , _type},第 1 部分 name 和第 3 部分 type 都是有效参数,可以替换。

      【讨论】:

        猜你喜欢
        • 2017-05-14
        • 2014-08-24
        • 2016-02-13
        • 1970-01-01
        • 1970-01-01
        • 2021-07-11
        • 2010-10-25
        • 2012-04-11
        相关资源
        最近更新 更多