2009-12-02 6 views
6

Est-il possible de concaténer des noms de variables en C? Plus précisément, j'ai un struct qui contient 6 variables similaires, il a appelé class1, class2, class3, etc.Concaténation des noms de variables dans C?

Je veux courir à travers une boucle pour assigner chaque variable une valeur, mais je ne vois pas comment faire sans pour autant concaténer le nom de la variable avec la valeur du compteur de boucle for.

Comment pourrais-je faire autrement?

Répondre

43

Lorsque vous vous trouvez en ajoutant un suffixe entier aux noms variables, pensez j'aurais utilisé un tableau.

struct mystruct { 
    int class[6]; 
}; 

int main(void) { 
    struct mystruct s; 
    int i; 
    for (i = 0; i < 6; ++i) { 
     s.class[i] = 1000 + i; 
    } 

    return 0; 
} 

Note: Un compilateur C++ sera barf à cause de ce class. Vous aurez besoin de trouver un nom différent pour ce champ si vous prévoyez de compiler ce code en C++.

5

Il existe des langages dynamiques dans lesquels vous pouvez faire ce genre de chose - C n'est pas l'un de ces langages. Je suis d'accord avec Sinan - les tableaux ou les vecteurs STL sont la solution.

Comme une expérience de pensée - ce qui se passerait si vous avez 100 000 de ces variables? Auriez-vous 100 000 lignes de code pour les initialiser?

+2

+1 Perl, par exemple, vous permet d'utiliser de telles références symboliques, mais leur utilisation est fortement ** ** déconseillée. http://perl.plover.com/varvarname.html –

1

Le préprocesseur C peut concatenate symboles, mais avez-vous envisagé d'utiliser un tableau?

+2

La concaténation du préprocesseur ne fonctionnera pas, car si vous concaténez 'class' avec la variable de boucle' i', vous produisez 'classi' et le compilateur se plaindra que symbole existe. – benzado

0

Ce que vous pouvez également faire, c'est écrire une implémentation d'une table de hachage. Puisque l'ensemble de clés (qui serait comme les noms de variables) de la table de hachage ne change pas au fil du temps, pour chaque carte de hachage, vous pouvez conserver un tableau de ses clés pour une itération efficace. Mais ce serait un total (fou) surpuissant, surtout dans C;)

peu près tout ce possible en C, il est une grande langue pour apprendre :)

0

peut-être le CERT-C sécuriser le codage règle pre05 -C «Comprendre le remplacement de macros lors de la concaténation de jetons ou de la mise en stringification» pourrait vous aider. Pour les détails, jetez un coup d'oeil à ce lien: https://www.securecoding.cert.org/confluence/display/seccode/PRE05-C.+Understand+macro+replacement+when+concatenating+tokens+or+performing+stringification.

en abrégé, définie d'abord une JOIN_AGAIN macro (x, y) (x ## y) puis JOIN (x, y) JOIN_AGAIN (x, y) La macro JOIN_AGAIN permet d'augmenter la valeur de la boucle couner qui sera concaténé au nom var.

Vive Pierre Bui

+0

Mauvais. Vous allez simplement produire 'classi'; Le préprocesseur produit simplement plus de caractères et n'a rien à voir avec les valeurs d'exécution. – GManNickG

+0

vous avez raison GMAN, merci pour ce commentaire. oups, pas bien réveillé dimanche matin. désolé de poster une mauvaise réponse. Pierre Bui –

Questions connexes