¿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 programa o, más probablemente, a través de una compilación previa? secuencia de comandos que utiliza los pases del compilador hasta el punto en que 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é.Obteniendo el tipo de variable en el código C
Me gustaría cambiar la semántica de la cláusula de reducción 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 guión sería convertir esta
#pragma omp parallel for reduction(+:x)
en esto:
my_reduction(PLUS, &x, sizeof(x));
#pragma omp parallel for
donde, antes, tengo (digamos)
enum reduction_op {PLUS, MINUS, TIMES, AND,
OR, BIT_AND, BIT_OR, BIT_XOR, /* ... */};
Y my_reduction
tiene la firma
void my_reduction(enum reduction_op op, void * var, size_t size);
Entre otras t hings, my_reduction
tendría que aplicar la operación de adición 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 la variable, no conoce el tipo de la variable en sí. En particular, no sabe si var
tiene un tipo integral o de coma flotante. Desde un POV de bajo nivel, la operación de adición para esas dos clases de tipos es completamente diferente.
Si solo el operador no estándar typeof
, que es compatible con GCC, funcionara como funciona sizeof - devolviendo algún tipo de variable de tipo - podría resolver este problema fácilmente. Pero typeof no es realmente como sizeof: solo se puede usar, al parecer, en declaraciones l-value.
Ahora, el compilador obviamente sabe 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 obtener el tipo x
y pasarlo a mi secuencia de comandos, y luego ejecutar GCC nuevamente, hasta el final, para compilar mi código fuente alterado. Entonces sería lo suficientemente simple para declarar
enum var_type { INT8, UINT8, INT16, UINT16, /* ,..., */ FLOAT, DOUBLE};
void my_reduction(enum reduction_op op, void * var, enum var_type vtype);
Y my_reduction
puede lanzar de forma adecuada antes de eliminación de referencias y aplicando el operador.
Como puede ver, estoy tratando de crear un tipo de mecanismo de "despacho" en C. ¿Por qué no usar solo la sobrecarga de C++? Porque mi proyecto me obliga a trabajar con código fuente heredado escrito en C. Puedo modificar el código automáticamente con un script, pero no puedo reescribirlo en otro idioma.
Gracias!
¿Qué hay de post-procesamiento de su código fuente con algunas herramientas/scripts? P.ej. analizarlo con clang, encontrar los tipos, insertar/ajustar el código específico del tipo, compilar? –
Gracias, Alex. Parece que va en la dirección correcta. –
Leí en alguna parte que la reducción definida por el usuario será parte del estándar 3.1 o 4.0. Hm 3.1 dice: 'reduction ({operator | intrinsic_procedure_name}: list)' ..never tried intrinsic_procedure_name. aunque solo resuelve parcialmente tu detección de tipo. – Bort