El sizeof incorporado puede tomar un tipo o una expresión y devolverá el valor apropiado.
Me gustaría crear una macro que use expresiones _Generic() para hacer algo similar. En particular, me gustaría poder pasar un nombre de tipo o un valor como parámetro, al igual que sizeof .
Como un ejemplo trivial, puedo hacer algo como esto:
#define F(x) _Generic((x)+0, int: 1, long: 2) Eso funciona porque (x)+0 puede ser una expresión aritmética o una conversión de tipos.
Pero eso no funciona cuando el tipo es struct Foo .
Podría usar sintaxis literal compuesta, con llaves: (x){0} pero eso falla para valores literales:
¿Hay algún horror de sintaxis C retorcido que permita el uso de nombres de tipo o expresiones en una expresión _Generic ?
Su idea literal compuesta funcionará si la combina con typeof . Sin embargo, tenga en cuenta que typeof es una extensión del lenguaje GCC C, por lo que es posible que no funcione en todos los compiladores de 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 }