c gcc typeof

c - getelementbyid



Conversión de typeof a cadena (2)

¿Hay alguna forma de convertir el tipo de extensión de gcc a una cadena, por ejemplo:

#define printType(a) printf("%s", #typeof(a))

Para que yo pueda hacer:

int a = 4; printf("Type of a is: "); printType(a);

Y obtenga la salida de:

Type of a is: int

Un posible uso de esto sería el siguiente:

#include <stdio.h> #define indirect_print(a) print_##typeof(a)(a) void print_int(int *i) { printf("%d", *i); } void print_char(char *c) { printf("%c", *c); } int main(void) { char C = ''C''; int I = 100; { char *a = &C; indirect_print(a); } { int *a = &I; indirect_print(a); } return 0; }

Si es posible, debería funcionar para todos los tipos, incluidas las estructuras y uniones, sin depender de agregar manualmente cada tipo a una lista.


El preprocesador se ejecuta antes del compilador. Entonces todos sus reemplazos se realizan antes de que comience la compilación real. typeof() es evaluado por el compilador, que solo vería una cadena "typeof()" que obviamente no será evaluada.

Entonces, la respuesta es: no para pre-C11. Para C11, consulte la respuesta de @tmlen, pero tenga en cuenta que existen algunas ambigüedades sobre los selectores de tipo _Generic que se resuelven de forma diferente en los diferentes compiladores, lo que puede ocasionar problemas con los tipos calificados. Hay un informe de defectos sobre este tema, lea el blob de Jens Gustedt para más detalles: https://gustedt.wordpress.com/2015/05/11/the-controlling-expression-of-_generic/#more-2256 (también archivó un informe de defectos http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_423.htm ).


Desde C11, puede usar un genérico, consulte http://en.cppreference.com/w/c/language/generic . Por ejemplo:

#define printType(a) printf("%s", _Generic( (a) , / int : "int", / long : "long", / float : "float", / default : "other type"))(a)

Todos los tipos que se pueden utilizar deben figurar en la lista.

En C ++, también está la palabra clave typeid :

#include <typeinfo> #define printType(a) std::cout << typeid(a).name() << std::endl;