【发布时间】:2021-03-02 02:58:31
【问题描述】:
在以下代码中:
struct Person {
char* name;
int age;
};
struct Book {
char* title;
char* author;
};
#define MYTYPE(X) _Generic((X), int: "int", float: "float", double: "double", struct Book: "book", struct Person: "person", default: "other")
以下作品:
struct Book ulysses = {"ulysses", "james"};
printf("%s\n", MYTYPE(ulysses));
struct Person jim;
jim = (struct Person) {"Tom", 20};
printf("%s\n", MYTYPE(jim));
但是,如果我尝试传递复合文字,它会失败:
printf("%s\n", MYTYPE((struct Person){"Tom", 10}));
gen.c:25:53: 错误:宏“MYTYPE”传递了 2 个参数,但只接受了 1 个
printf("%s\n", MYTYPE((struct Person){"Tom", 10}));
..................................................... .................... ^
将struct Person 传递给MYTYPE 宏似乎有什么问题?
更新:似乎将表达式双重包装在括号中可以解决此问题,但我不确定为什么需要这样做:
printf("%s\n", MYTYPE(((struct Person){"Tom", 10})));
【问题讨论】:
-
@chux-ReinstateMonica 是的,有效,但我很好奇,如果我已经在函数调用中,为什么需要该部分
() -
嗯......
-
什么编译器和版本?
-
@Shawn gcc 7.5.0 (在 c 代码中执行
__VERSION__——这就是你的意思吗?) -
在 Godbolt 上玩新的 gcc 版本(和 clang)?可能是一个编译器错误,希望得到修复。
标签: c