3 Stimmen

Das Lesen von Variablen mit dem C-Präprozessor

Ich stieß auf das folgende Problem, als ich versuchte, die Verkettung mit dem C Präprozessor zu verwenden:

#define substitute(id) var##id
int main()
{
     int var0 = 999;
     int var1 = 998;
     int var2 = 997;
     int var3 = 996;
     int var4 = 995;

     int i = 0;

     for(i; i < 5; i++)
     {
          printf("Wert: %i \n",  substitute(i));      
     }

     system("PAUSE");
     return 0;

}

Gibt es eine Möglichkeit, dass der Präprozessor den Wert von "i" lesen kann, anstatt nur "vari" zu verketten?

2voto

Luchian Grigore Punkte 244505

Nein. Der Präprozessor funktioniert vor der Kompilierung und daher vor der Ausführung.

Das Define

#define ersatz(id) var##id

wird dazu führen, dass Ihre Schleife erweitert wird zu:

 for(i; i < 5; i++)
 {
      printf("Wert: %i \n",  vari);      
 }

Der Präprozessor hat keine Kenntnis von der Variablen i, und das sollte er auch nicht.

Sie sollten wahrscheinlich ein Array verwenden:

int var[5] = {999,998,997,996,995};

und darauf über [] zugreifen:

for(i; i < 5; i++)
{
    printf("Wert: %i \n",  var[i]);      
}

2voto

David Heffernan Punkte 585606

Dies ist im Präprozessor-Stadium nicht möglich, da das, was Sie möchten, von Werten abhängt, die erst später zur Laufzeit bekannt sind.

Was Sie benötigen, ist ein Array und der Indexoperator, var[i].

0voto

Dabbler Punkte 9485

Sie müssen sich bewusst sein, dass das Makro einmal aufgelöst wird (vom Preprozessor) bevor die Datei kompiliert wird, so dass zur Laufzeit jede Iteration in der Schleife dasselbe Ergebnis rendern wird, wenn "substitute" aufgerufen wird.

0voto

Seth Carnegie Punkte 72029

Nein, weil der Präprozessor zur Kompilierzeit und nicht zur Laufzeit läuft, aber du kannst ein Array verwenden:

int vars[] = { 999, 998, 997, 996, 995 };

for (int i = 0; i < 5; ++i)
    printf("Wert: %i \n", vars[i]);

0voto

rerun Punkte 24318

Nein, i ist eine Laufzeitbewertung. Der Präprozessor kann nicht wissen, welchen Wert I haben könnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X