Concatenare i nomi delle variabili in C?

È ansible concatenare nomi di variabili in C? In particolare, ho una struct che contiene 6 variabili simili denominate class1 , class2 , class3 , ecc.

Voglio eseguire un ciclo for per assegnare a ciascuna variabile un valore, ma non riesco a vedere come farlo senza concatenare in qualche modo il nome della variabile con il valore del contatore di cicli for.

In quale altro modo potrei farlo?

Quando ti ritrovi ad aggiungere un suffisso intero ai nomi delle variabili, penso che avrei dovuto usare un array .

 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; } 

Nota: un compilatore C ++ si sbarazzerà di questo a causa della class . Dovrai trovare un nome diverso per quel campo se pianifichi di compilare questo codice come C ++.

Ci sono linguaggi dinamici in cui puoi fare questo genere di cose – C non è una di queste lingue. Sono d’accordo con Sinan – gli array oi vettori STL sono la strada da percorrere.

Come esperimento mentale: cosa succederebbe se avessi 100.000 di queste variabili? Avresti 100.000 linee di codice per inizializzarle?

Il preprocessore C può concatenare i simboli, ma hai considerato solo l’uso di un array?

Quello che potresti anche fare, è scrivere un’implementazione di una mappa di hash. Poiché il set di chiavi (che sarebbe come i nomi delle variabili) della mappa hash non cambia nel tempo, per ogni mappa hash è ansible mantenere un array delle sue chiavi per iterare in modo efficiente. Ma sarebbe un totale (pazzo) eccessivo, specialmente in C;)

Praticamente tutto è ansible in C, è un ottimo linguaggio per imparare 🙂

forse la regola di codifica sicura CERT-C PRE05-C ‘Capire la sostituzione delle macro quando si concatenano i token o si eseguono le stringificazioni’ potrebbe aiutarti. Per i dettagli più approfonditi, guarda questo link: https://www.securecoding.cert.org/confluence/display/seccode/PRE05-C.+Understand+macro+replacement+quando+concatenating+tokens+or+performing+stringification .

In breve, definisci prima una macro JOIN_AGAIN (x, y) (x ## y) e poi JOIN (x, y) JOIN_AGAIN (x, y) La macro JOIN_AGAIN consente di espandere il valore del numero di loop che sarà concatenato al nome var.

Saluti Pierre Bui