2009-12-02 21 views
6

Ist es möglich, Variablennamen in C zu verketten? Insbesondere habe ich ein struct, die 6 ähnliche Variablen enthält darin genannt class1, class2, class3 usw.Verketten von Variablennamen in C?

Ich möchte durch eine for-Schleife laufen jede Variable ein Wert zugewiesen werden, aber ich kann nicht sehen, wie zu tun ohne den Variablennamen irgendwie mit dem Wert des for-Schleifenzählers zu verketten.

Wie sonst könnte ich das tun?

Antwort

43

Wenn man sich das Hinzufügen eines Integer-Suffix zu Variablennamen, denken ich ein Array verwendet haben sollte.

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

Hinweis: Ein C++ Compiler wird wegen class an diesem barf. Sie müssen einen anderen Namen für dieses Feld herausfinden, wenn Sie vorhaben, diesen Code als C++ zu kompilieren.

5

Es gibt dynamische Sprachen, in denen Sie so etwas tun können - C ist keine dieser Sprachen. Ich stimme Sinan - Arrays oder STL-Vektoren sind der Weg zu gehen.

Als ein Gedankenexperiment - was würde passieren, wenn Sie 100.000 dieser Variablen haben? Würden Sie 100.000 Zeilen Code haben, um sie zu initialisieren?

+2

+1 Perl, zum Beispiel, können Sie solche symbolische Referenzen verwenden, aber ihre Verwendung ist ** ** stark abgeraten. http://perl.plover.com/varvarname.html –

1

Der C-Präprozessor kann concatenate Symbole, aber haben Sie in Betracht gezogen, nur ein Array zu verwenden?

+2

Preprocessor Verkettung wird nicht funktionieren, denn wenn Sie 'class' mit der Loop-Variable' i' verketten, produzieren Sie 'classi' und der Compiler wird sich beschweren, dass keine solche Symbol existiert. – benzado

0

Was Sie auch tun könnten, ist eine Implementierung einer Hash-Map schreiben. Da sich die Menge der Schlüssel (die wie Variablennamen sind) der Hash-Map im Laufe der Zeit nicht ändert, könnten Sie für jede Hash-Map ein Array ihrer Schlüssel für die effiziente Iteration behalten. Aber das wäre ein total (verrückt) Overkill, vor allem in C sein;)

So ziemlich alles ist möglich in C, dann ist es eine großartige Sprache Codierungsregel PRE05 :)

0

vielleicht die CERT-C sicher lernen -C 'Verstehen der Makroersetzung bei der Verkettung von Token oder der Stringifizierung' könnte Ihnen helfen. Für tiefe Details schauen Sie sich diesen Link an: https://www.securecoding.cert.org/confluence/display/seccode/PRE05-C.+Understand+macro+replacement+when+concatenating+tokens+or+performing+stringification.

kurz definiert zunächst ein Makro JOIN_AGAIN (x, y) (x ## y) und dann JOIN (x, y) JOIN_AGAIN (x, y) Der JOIN_AGAIN Makro erlaubt, den Wert des Schleife couner zu erweitern welches mit dem Var-Namen verkettet wird.

Prost Pierre Bui

+0

Falsch. Sie werden nur 'classi' produzieren; Präprozessor erzeugt einfach mehr Zeichen und hat nichts mit Laufzeitwerten zu tun. – GManNickG

+0

du hast Recht GMAN, danke für diesen Kommentar. Upps, nicht gut wach am Sonntagmorgen. Entschuldigung, um eine falsche Antwort zu posten. Pierre Bui –