如何将类型或值传递给 _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 可以是算术表达式或类型转换。

但当类型为 struct Foo 时,这不起作用。

我可以使用带大括号的复合文字语法:(x){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
}