gpt4 book ai didi

c - 将复合文字传递给 _Generic 不起作用

转载 作者:行者123 更新时间:2023-12-04 01:06:00 25 4
gpt4 key购买 nike

在下面的代码中:

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: error: macro "MYTYPE" passed 2 arguments, but takes just 1
printf("%s\n", MYTYPE((struct Person){"Tom", 10}));
............................................................................... ^

struct Person 传递给 MYTYPE 宏似乎有什么问题?


更新:似乎将表达式用双括号括起来解决了这个问题,但我不确定为什么需要这样做:

printf("%s\n", MYTYPE(((struct Person){"Tom", 10})));

最佳答案

您已使用 2 个参数调用了 MYTYPE:(struct Person){"Tom"10}。与括号不同,大括号在预处理器级别没有语法意义,并且不会抑制逗号作为宏参数分隔符的作用。您需要将复合文字括起来以避免这种情况。或者,在某些情况下(包括您的情况),您可以使用 ...__VA_ARGS__ 制作可变参数宏来避免该问题。另见我的问题:Compound literals and function-like macros: bug in gcc or the C standard?

关于c - 将复合文字传递给 _Generic 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66432670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com