如何将类型或值传递给 _Generic()
How can I pass either type or value to _Generic()
sizeof
内置函数可以采用类型或表达式,并将 return 适当的值。
我想构建一个使用 _Generic()
表达式来执行类似操作的宏。特别是,我希望能够将类型名称或值作为参数传递,就像 sizeof
.
作为一个简单的例子,我可以这样做:
#define F(x) _Generic((x)+0, int: 1, long: 2)
之所以可行,是因为 (x)+0
可以是算术表达式或类型转换。
- (1)+0 -> 1+0 -> 1 -> 整数:1
- (长)+0 -> 0L -> 长:2
但当类型为 struct Foo
时,这不起作用。
我可以使用带大括号的复合文字语法:(x){0}
但文字值失败:
- (长){0} - 有效
- (struct Foo){0} - 有效
- (1){0} - 没那么多。 :-(
是否有一些扭曲的 C 语法恐怖允许在 _Generic
表达式中使用类型名称或表达式?
如果您将复合文字的想法与 typeof
结合起来,您的想法就会奏效。
但是,请注意 typeof
是 GCC C 语言扩展,因此它可能不适用于每个 C 编译器。
#include <stdio.h>
typedef struct Foo {
int mx;
} Foo;
#define F(x) _Generic((typeof(x)){0}, \
int: 1, \
long: 2, \
struct Foo: 3)
int main()
{
printf("%d\n", F(0)); // 1
printf("%d\n", F(int)); // 1
printf("%d\n", F((long)0)); // 2
printf("%d\n", F(long)); // 2
printf("%d\n", F((Foo){1})); // 3
printf("%d\n", F(Foo)); // 3
}
sizeof
内置函数可以采用类型或表达式,并将 return 适当的值。
我想构建一个使用 _Generic()
表达式来执行类似操作的宏。特别是,我希望能够将类型名称或值作为参数传递,就像 sizeof
.
作为一个简单的例子,我可以这样做:
#define F(x) _Generic((x)+0, int: 1, long: 2)
之所以可行,是因为 (x)+0
可以是算术表达式或类型转换。
- (1)+0 -> 1+0 -> 1 -> 整数:1
- (长)+0 -> 0L -> 长:2
但当类型为 struct Foo
时,这不起作用。
我可以使用带大括号的复合文字语法:(x){0}
但文字值失败:
- (长){0} - 有效
- (struct Foo){0} - 有效
- (1){0} - 没那么多。 :-(
是否有一些扭曲的 C 语法恐怖允许在 _Generic
表达式中使用类型名称或表达式?
如果您将复合文字的想法与 typeof
结合起来,您的想法就会奏效。
但是,请注意 typeof
是 GCC C 语言扩展,因此它可能不适用于每个 C 编译器。
#include <stdio.h>
typedef struct Foo {
int mx;
} Foo;
#define F(x) _Generic((typeof(x)){0}, \
int: 1, \
long: 2, \
struct Foo: 3)
int main()
{
printf("%d\n", F(0)); // 1
printf("%d\n", F(int)); // 1
printf("%d\n", F((long)0)); // 2
printf("%d\n", F(long)); // 2
printf("%d\n", F((Foo){1})); // 3
printf("%d\n", F(Foo)); // 3
}