这是一个简单的演示。但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;
}
答案 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部分类型都是有效参数,可以替换。