¿Cómo obtener el tipo de una variable en el código C?

¿Hay alguna manera de que pueda descubrir el tipo de una variable automáticamente en C, ya sea a través de algún mecanismo dentro del propio programa o, más probablemente, a través de un script de precompilación que utiliza los pasos del compilador hasta el punto donde ¿ha analizado las variables y les ha asignado sus tipos? Estoy buscando sugerencias generales sobre esto. A continuación hay más antecedentes sobre lo que necesito y por qué.

Me gustaría cambiar la semántica de la cláusula de reducción de OpenMP. En este punto, parece más fácil simplemente reemplazar la cláusula en el código fuente (a través de un script) con una llamada a una función, y luego puedo definir la función para implementar la semántica de reducción que quiero. Por ejemplo, mi script convertiría este

#pragma omp parallel for reduction(+:x)

dentro de esto

my_reduction(PLUS, &x, sizeof(x));
#pragma omp parallel for

where, anteriormente, tengo (digamos)

enum reduction_op {PLUS, MINUS, TIMES, AND,
  OR, BIT_AND, BIT_OR, BIT_XOR, /* ... */};

Ymy_reduction tiene firma

void my_reduction(enum reduction_op op, void * var, size_t size);

Entre otras cosas,my_reduction tendría que aplicar la operación de suma a la variable de reducción como el programador había pensado originalmente. Pero mi función no puede saber cómo hacer esto correctamente. En particular, aunque conoce el tipo de operación PLUS), la ubicación de la variable original var), y el tamaño del tipo de variable, no conoce el tipo de variable en sí. En particular, no sabe sivar tiene un tipo integral o de coma flotante. Desde un POV de bajo nivel, la operación de suma para esas dos clases de tipos es completamente diferente.

Si solo el operador no estándartypeof, que admite GCC, funcionaría de la forma en que sizeof funciona, devolviendo algún tipo de variable de tipo, podría resolver este problema fácilmente. Pero typeof no es realmente como sizeof: solo puede usarse, aparentemente, en declaraciones de valor l.

Ahora, el compilador obviamente conoce el tipo de x antes de que termine de generar el código ejecutable. Esto me lleva a preguntarme si de alguna manera puedo aprovechar el analizador de GCC, solo para obtenerx 's y páselo a mi script, y luego ejecute GCC nuevamente, hasta el final, para compilar mi código fuente alterado. Entonces sería lo suficientemente simple como para declarar

enum var_type { INT8, UINT8, INT16, UINT16, /* ,..., */ FLOAT, DOUBLE};
void my_reduction(enum reduction_op op, void * var, enum var_type vtype);

Ymy_reduction puede emitir correctamente antes de desreferenciar y aplicar el operador.

Como puede ver, estoy tratando de crear una especie de mecanismo de "despacho" en C. ¿Por qué no usar la sobrecarga de C ++? Debido a que mi proyecto me limita a trabajar con código fuente heredado escrito en C. Puedo alterar el código automáticamente con un script, pero no puedo reescribirlo en un idioma diferente.

¡Gracias

Respuestas a la pregunta(10)

Su respuesta a la pregunta