it-swarm.com.de

ISO C90 verbietet gemischte Deklarationen und Codes in C

Ich habe eine Variable folgendermaßen deklariert:

int i = 0;

Ich bekomme die Warnung: 

ISO C90 verbietet gemischte Deklarationen und Codes

Wie kann ich es reparieren?

57
user707549

Ich denke, Sie sollten die Variablendeklaration in den Blockanfang verschieben. Das heißt.

{
    foo();
    int i = 0;
    bar();
}

zu

{
    int i = 0;
    foo();
    bar();
}
91
Johan Kotlinski

Bis zum C99-Standard mussten alle Deklarationen vor Anweisungen in einem Block stehen:

void foo()
{
  int i, j;
  double k;
  char *c;

  // code

  if (c)
  {
    int m, n;

    // more code
  }
  // etc.
}

C99 erlaubt das Mischen von Deklarationen und Anweisungen (wie C++). Viele Compiler verwenden immer noch C89, und einige Compiler (wie beispielsweise Microsoft) unterstützen C99 überhaupt nicht

Sie müssen also Folgendes tun:

  1. Stellen Sie fest, ob Ihr Compiler C99 oder höher unterstützt. Wenn dies der Fall ist, konfigurieren Sie es so, dass C99 anstelle von C89 kompiliert wird.

  2. Wenn Ihr Compiler C99 oder höher nicht unterstützt, müssen Sie entweder einen anderen Compiler suchen, der do unterstützt, oder den Code so umschreiben, dass alle Deklarationen vor Anweisungen im Block stehen. 

26
John Bode

Verwenden Sie einfach einen Compiler (oder geben Sie ihm die erforderlichen Argumente an), sodass er für eine neuere Version des C-Standards C99 oder C11 kompiliert. Zum Beispiel für die GCC-Familie von Compilern, die -std=c99 wäre.

10
Jens Gustedt

Stellen Sie sicher, dass sich die Variable im oberen Teil des Blocks befindet. Falls Sie sie mit -ansi-pedantic kompilieren, stellen Sie sicher, dass sie wie folgt aussieht:

function() {
    int i;
    i = 0;

    someCode();
}
3
Ron Nuni

Um zu diagnostizieren, was den Fehler wirklich auslöst, würde ich zuerst versuchen, = 0 zu entfernen.

  • Wenn der Fehler ausgelöst wird, folgt die Deklaration höchstwahrscheinlich dem Code.

  • Wenn kein Fehler vorliegt, kann es sich auf ein Erzwingen/Kompilieren von C-Standards OR ... etwas anderes beziehen.

In jedem Fall müssen Sie die Variable am Anfang des aktuellen Bereichs deklarieren. Sie können es dann separat initialisieren. Wenn diese Variable ihren eigenen Geltungsbereich verdient, begrenzen Sie ihre Definition in {}.

Wenn das OP den Kontext klarstellen könnte, würde eine gezieltere Antwort folgen.

2
vmsnomad

-Wdeclaration-after-statement minimal reproduzierbares Beispiel

#!/usr/bin/env bash

set -eux

cat << EOF > main.c
#include <stdio.h>

int main(void) {
    puts("hello");
    int a = 1;
    printf("%d\n", a);
    return 0;
}
EOF

# Give warning.
! gcc -std=c89 -Wdeclaration-after-statement -Werror main.c
! gcc -std=c99 -Wdeclaration-after-statement -Werror main.c
! gcc -std=c89 -pedantic -Werror main.c

# Don't give warning.
gcc -std=c89 -pedantic -Wno-declaration-after-statement -Werror main.c
gcc -std=c89 -Wno-declaration-after-statement -Werror main.c
gcc -std=c99 -pedantic -Werror main.c
gcc -std=c89 -Wall -Wextra -Werror main.c
# https://stackoverflow.com/questions/14737104/what-is-the-default-c-mode-for-the-current-gcc-especially-on-ubuntu/53063656#53063656
gcc -pedantic -Werror main.c

Die Warnung:

main.c: In function ‘main’:
main.c:5:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
     int a = 1;
     ^~~

Getestet auf Ubuntu 16.04, GCC 6.4.0.