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