Como obter o tipo de uma variável no código

Existe alguma maneira de descobrir o tipo de uma variável automaticamente em C, através de algum mecanismo dentro do próprio programa ou, mais provavelmente, através de um script de pré-compilação que usa as passagens do compilador até o ponto em que analisou as variáveis e atribuiu a eles seus tipos? Estou procurando sugestões gerais sobre isso. Abaixo, há mais informações sobre o que eu preciso e por qu

Gostaria de alterar a semântica da cláusula de redução do OpenMP. Nesse ponto, parece mais fácil simplesmente substituir a cláusula no código-fonte (por meio de um script) por uma chamada para uma função, e então eu posso definir a função para implementar a semântica de redução que eu quero. Por exemplo, meu script converteria esse

#pragma omp parallel for reduction(+:x)

nisso

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

onde, anteriormente, eu tenho (digamos)

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

Andmy_reduction tem assinatura

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

Entre outras coisas,my_reduction teria que aplicar a operação de adição à variável de redução, como o programador pretendia originalmente. Mas minha função não pode saber como fazer isso corretamente. Em particular, embora saiba o tipo de operação PLUS), a localização da variável original var) e o tamanho do tipo da variável, ele não conhece o próprio tipo da variável. Em particular, não se sabe sevar tem um tipo de ponto flutuante ou integral. Em um POV de baixo nível, a operação de adição para essas duas classes de tipos é completamente diferent

Se apenas o operador fora do padrãotypeof, que o GCC suporta, funcionaria da maneira que sizeof funciona - retornando algum tipo de variável de tipo - eu poderia resolver esse problema facilmente. Mas typeof não é realmente como sizeof: apenas pode ser usado, aparentemente, em declarações de valor l.

Agora, o compilador obviamente conhece o tipo de x antes de terminar de gerar o código executável. Isso me leva a pensar se posso, de alguma forma, aproveitar o analisador do GCC, apenas para obterx, passe-o para o meu script e execute o GCC novamente, todo o caminho, para compilar meu código-fonte alterado. Seria então simples o suficiente declarar

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

Andmy_reduction pode ser convertido adequadamente antes de remover a referência e aplicar o operado

Como você pode ver, estou tentando criar um tipo de mecanismo de "despacho" em C. Por que não usar sobrecarga de C ++? Como meu projeto me obriga a trabalhar com o código-fonte herdado escrito em C. Posso alterar o código automaticamente com um script, mas não posso reescrevê-lo para um idioma diferent

Obrigado

questionAnswers(10)

yourAnswerToTheQuestion