如何在宏中使用##?

时间:2018-06-19 02:07:03

标签: c macros

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

我只是想快速设置我的结构的值,以及' 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;
}

3 个答案:

答案 0 :(得分:5)

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

您不需要在此处使用它,您只需撰写cfg->column = value

答案 1 :(得分:1)

##用于将两个有效的预处理器令牌连接成一个。 cfg->不是有效的预处理器令牌,而是cfg。因此,您会收到编译器错误。

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

请注意,像这样的宏通常是不好的做法,最好是功能。

答案 2 :(得分:0)

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

示例:

#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中,名称_ ## type ## _ type分为3部分:{名称_ 类型 _type },仅限第2部分类型是一个有效的参数,可以替换。

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