Comment obtenir le type d'une variable dans le code C?

Est-il possible que je peux découvrir le type d'une variable automatiquement en C, soit par le biais d'un mécanisme au sein du programme lui-même, ou-plus probablement-par le biais d'une pré-compilation script qui utilise le compilateur passe à l'endroit où il a analysé les variables et leurs types? Je suis à la recherche de suggestions d'ordre général à ce sujet. Ci-dessous plus d'information sur ce dont j'ai besoin et pourquoi.

Je voudrais changer la sémantique de la OpenMP clause de réduction. À ce stade, il semble plus facile simplement de remplacer la clause dans le code source (via un script) avec un appel à une fonction, et puis je peux définir la fonction de mettre en œuvre la réduction de la sémantique que je veux. Par exemple, mon script serait de convertir cette

#pragma omp parallel for reduction(+:x)

dans cette:

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

où, précédemment, j'ai (dire)

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

Et my_reduction a la signature

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

Entre autres choses, my_reduction aurait à appliquer l'opération d'addition à la réduction de la variable que le programmeur avait initialement prévu. Mais ma fonction ne peut pas savoir comment le faire correctement. En particulier, bien qu'il connaît la nature de l'opération (PLUS), l'emplacement de la variable d'origine (var), et la taille du type de la variable, il ne sait pas le type de la variable elle-même. En particulier, il ne sait pas si var a un entier ou à virgule flottante de type. À partir d'un faible niveau de POV, l'opération d'addition de ces deux classes de types complètement différents.

Si seulement la non standard de l'opérateur typeof, le GCC prend en charge, fonctionne de la manière sizeof fonctionne--retour d'une sorte de type de variable, je pourrais résoudre ce problème facilement. Mais typeof n'est pas vraiment comme sizeof: il ne peut être utilisé, apparemment, dans l'-les déclarations de valeur.

Maintenant, le compilateur ne peut évidemment connaître le type de x avant la fin de la génération du code exécutable. Ce qui m'amène à me demander si je peux en quelque sorte l'effet de levier du CCG analyseur, juste pour obtenir x's type et le transmettre à mon script et exécutez GCC encore une fois, tout le chemin, pour compiler mes modifié le code source. Il serait alors assez simple de déclarer

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

Et my_reduction peut jeter de façon appropriée avant de déférence et de l'application de l'opérateur.

Comme vous pouvez le voir, je suis en train de créer une sorte de "dispatching" mécanisme de C. Pourquoi ne pas simplement utiliser le C++ surcharge? Parce que mon projet me contraint à travailler avec l'héritage de code source écrit en C. je peux modifier le code automatiquement avec un script, mais je ne peux pas réécrire dans une autre langue.

Merci!

Comment parler de post-traitement de votre code source avec quelques outils/scripts? E. g. analyser avec clang, trouver les types, insérer/réglage spécifiques à un type de code, le compiler?
Merci, Alex. Qui semble aller dans la bonne direction.
J'ai lu quelque part que définis par l'utilisateur de réduction sera de la partie de l'3.1 ou 4.0 standard. Hm 3.1 dit: reduction({operator|intrinsic_procedure_name}:list) ..jamais essayé intrinsic_procedure_name. cependant il ne résout en partie le type de détection.
nvm. intrinsic_procedure_name se réfère à quelque chose d'autre.

OriginalL'auteur Amittai Aviram | 2012-02-06