Concaténer des noms de variables en C?

Est-il possible de concaténer des noms de variables en C? Plus précisément, j’ai une struct qui contient 6 variables similaires, appelées class1 , class1 , class1 , etc.

Je souhaite parcourir une boucle for pour atsortingbuer une valeur à chaque variable, mais je ne vois pas comment le faire sans concaténer le nom de la variable avec la valeur du compteur de boucle for.

Comment pourrais-je faire cela autrement?

Lorsque vous vous trouvez en train d’append un suffixe entier aux noms de variables, pensez que j’aurais dû utiliser 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; } 

Remarque: Un compilateur C ++ va se plaindre à cause de sa class . Vous devrez trouver un nom différent pour ce champ si vous envisagez de comstackr ce code en tant que C ++.

Il existe des langages dynamics où 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 voie à suivre.

En tant qu’expérience de pensée, que se passerait-il si vous aviez 100 000 de ces variables? Auriez-vous 100 000 lignes de code pour les initialiser?

Le préprocesseur C peut concaténer des symboles, mais avez-vous envisagé de n’utiliser qu’un tableau?

Ce que vous pouvez également faire, c’est écrire une implémentation d’une carte de hachage. Étant donné que l’ensemble de clés (qui ressemblent à des noms de variables) de la carte de hachage ne change pas au fil du temps, vous pouvez conserver pour chaque carte de hachage un tableau de ses clés pour une itération efficace. Mais ce serait une surdose totale (folle), surtout en C;)

Presque tout est possible en C, c’est une excellente langue à apprendre 🙂

peut-être que la règle de codage sécurisé CERT-C PRE05-C intitulée «Comprendre le remplacement de macros lors de la concaténation de jetons ou de la personnalisation» peut vous aider. Pour plus de détails, jetez un coup d’œil à ce lien: https://www.securecoding.cert.org/confluence/display/seccode/PRE05-C.+Understand+++++++++++++++++++++++++++++++++++++. .

En bref, définissons d’abord une macro JOIN_AGAIN (x, y) (x ## y), puis JOIN (x, y) JOIN_AGAIN (x, y). La macro JOIN_AGAIN permet d’élargir la valeur du compteur de boucle qui sera concaténée au nom var.

Pierre Bui