C: for loop int anfängliche Deklaration

Lesezeit: 3 Minuten

Benutzeravatar von Midnight Blue
Mitternachtsblau

Kann jemand den folgenden gcc-Fehler näher erläutern?

$ gcc -o Ctutorial/temptable.out temptable.c 
temptable.c: In function ‘main’:
temptable.c:5: error: ‘for’ loop initial declaration used outside C99 mode

versuchbar.c:

...
/* print Fahrenheit-Celsius Table */
main()
{
    for(int i = 0; i <= 300; i += 20)
    {
        printf("F=%d C=%d\n",i, (i-32) / 9);        
    }
}

PS: Daran erinnere ich mich vage int i sollte vor a deklariert werden for Schleife. Ich sollte sagen, dass ich nach einer Antwort suche, die einen historischen Kontext des C-Standards gibt.

  • Weitere Informationen finden Sie in dieser vorherigen Frage zur Deklaration von C-Variablen: stackoverflow.com/questions/288441/…

    – Kyle Walsh

    17. August 2009 um 13:12 Uhr

  • Beachten Sie, dass die Temperaturumrechnungsformel falsch ist; in ganzzahliger Arithmetik sollte es so sein (5 * (i - 32)) / 9 (das 5 wird vermisst). Normalerweise benötigen Sie Fließkommaarithmetik – aber dann müssen Sie Ihr printf-Format von ändern C=%d zu C=%./2f oder etwas ähnliches (und Sie konvertieren mit (5.0 * (i - 32)) / 9.0).

    – Jonathan Leffler

    2. September 2019 um 17:50 Uhr

Benutzeravatar von dfa
dfa

for (int i = 0; ...) 

ist eine Syntax, die in C99 eingeführt wurde. Um es zu verwenden, müssen Sie den C99-Modus durch Passieren aktivieren -std=c99 (oder ein späterer Standard) zu GCC. Die C89-Version ist:

int i;
for (i = 0; ...)

BEARBEITEN

Historisch hat die C-Sprache Programmierer immer gezwungen, alle Variablen am Anfang eines Blocks zu deklarieren. Also sowas wie:

{
   printf("%d", 42); 
   int c = 43;  /* <--- compile time error */

muss umgeschrieben werden als:

{
   int c = 43;
   printf("%d", 42);

Ein Block ist definiert als:

block := '{' declarations statements '}'

C99, C++, C# und Java erlauben die Deklaration von Variablen überall in einem Block.

Der wahre Grund (Vermutung) besteht darin, interne Strukturen (wie das Berechnen der Stapelgröße) so schnell wie möglich zuzuweisen, während die C-Quelle analysiert wird, ohne einen weiteren Compilerdurchgang zu durchlaufen.

  • Nur eine Anmerkung: Wenn Sie die c99-Version verwenden, vergessen Sie nicht, dass die deklarierte Variable lokal für den for-Schleifenblock ist und danach nicht mehr existiert, wenn sie den Gültigkeitsbereich verlassen hat.

    – Ely

    30. März 2016 um 2:42 Uhr

  • Eine zusätzliche Anmerkung, die von historischem Interesse sein könnte. Eine Möglichkeit, diese Regel vor dem C99-Standard zu umgehen, bestand darin, einen Block innerhalb eines Blocks zu erstellen. Sie würden eine Variable in der Mitte eines Blocks deklarieren und sie und den Code, der sie verwendet, mit mehr Klammern umgeben {}

    – Neil Roy

    29. Dezember 2016 um 5:40 Uhr


  • Es ist auch erwähnenswert, dass zum Beispiel bei neuen Versionen von GCC die Standardversion von C auf eine aktuellere Version als C89 aktualisiert wird –> also wird dieses ganze Problem überhaupt keinen Kompilierungsfehler verursachen … ( Ich verwende gcc 5.4.0 auf Ubuntu 16.04 und hatte keine Kompilierungsfehler, keine Warnungen für dieses Code-Snippet).

    – Guy Avraham

    11. Oktober 2017 um 8:35 Uhr

  • Fügen Sie einfach ein Wort hinzu, wenn jemand wirklich damit mit dem Compiler-Flag experimentieren möchte -std=c89: Vergessen Sie nicht hinzuzufügen -pedantic um den Compiler zu bitten, ernst zu werden.

    – aafulei

    12. September 2019 um 7:37 Uhr


Vor C99 mussten Sie die lokalen Variablen am Anfang eines Blocks definieren. C99 hat die C++-Funktion importiert, mit der Sie lokale Variablendefinitionen mit den Anweisungen mischen und Variablen in der definieren können for und while Steuerausdrücke.

1412990cookie-checkC: for loop int anfängliche Deklaration

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy