ISO C90 verbietet gemischte Deklarationen und Code in C

Lesezeit: 4 Minuten

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?

  • Klingt nach GCC -pedantic oder -std=c89in diesem Fall können Sie mit kompilieren -std=gnu99 wenn du möchtest.

    – Dietrich Ep

    8. November 2012 um 14:56 Uhr

  • Wenn Sie gcc verwenden, können Sie angeben, dass C99 verwendet werden soll, was gemischte Deklarationen und Code erlaubt (flag -std=c99).

    – hmjd

    8. November 2012 um 14:56 Uhr

  • Eine Möglichkeit wäre, die Kompilierung nach einem 22 Jahre alten Standard einzustellen, für den sogar der Ersatz ersetzt wurde.

    – Stefan Kanon

    8. November 2012 um 14:56 Uhr


  • @StephenCanon, bitte teilen Sie das Microsoft mit. 🙂

    – hmjd

    8. November 2012 um 14:56 Uhr

  • @hmjd: Microsoft hat kein Interesse daran, einen C-Compiler zu liefern; das wird sich wohl nicht ändern. Glücklicherweise gibt es eine Reihe absolut guter Compiler, die auf die von anderen Anbietern bereitgestellte Plattform abzielen.

    – Stefan Kanon

    8. November 2012 um 14:57 Uhr


Ich denke, Sie sollten die Variablendeklaration an den Anfang des Blocks verschieben. Dh

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

zu

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

  • … oder öffnen Sie einen neuen Kontext: {foo(); {int i=0; bar();}}

    – alk

    8. November 2012 um 14:58 Uhr


  • @alk s/context/block So heißt es im C-Standard.

    – Jens

    8. Juni 2013 um 19:12 Uhr


  • @Johan Kotlinski Aber warum ist das wichtig?

    – Ozean800

    14. Februar 2016 um 23:15 Uhr

  • @ocean800 Die C90-Spezifikation besagt, dass Sie keine Deklarationen nach Nicht-Deklarationen im selben Block haben können.

    – MM

    16. Februar 2017 um 1:40 Uhr

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

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

  // code

  if (c)
  {
    int m, n;

    // more code
  }
  // etc.
}

C99 erlaubte das Mischen von Deklarationen und Anweisungen (wie C++). Viele Compiler verwenden immer noch standardmäßig C89, und einige Compiler (z. B. von Microsoft) unterstützen C99 nicht überhaupt.

Sie müssen also Folgendes tun:

  1. Stellen Sie fest, ob Ihr Compiler C99 oder höher unterstützt; Wenn ja, konfigurieren Sie es so, dass es C99 anstelle von C89 kompiliert;

  2. Wenn Ihr Compiler C99 oder höher nicht unterstützt, müssen Sie entweder einen anderen Compiler finden tut unterstützen oder Ihren Code so umschreiben, dass alle Deklarationen vor allen Anweisungen innerhalb des Blocks stehen.

Verwenden Sie einfach einen Compiler (oder versehen Sie ihn mit den erforderlichen Argumenten), sodass er für eine neuere Version des C-Standards, C99 oder C11, kompiliert. Das wäre zB für die GCC-Compilerfamilie -std=c99.

  • Diese Antwort ist bestenfalls unvollständig. Es behebt das Problem, erklärt aber nicht, was es verursacht hat. Diese Antwort schließt Situationen aus, in denen ein neuerer Compiler nicht möglich ist (mehrere mögliche Gründe …) oder Build-Umgebungen, in denen das Umschalten von Optionen auf den Compiler wie folgt nicht möglich ist. Eine Ablehnung, weil ich nicht zustimmen kann, dass dies die “echte” Antwort ist.

    – Andrew Falanga

    8. Juli 2015 um 18:44 Uhr

  • In manchen Fällen -std=gnu89 wird beim Kompilieren von Linux-Kernel-Modulen verwendet.

    – cbix

    13. März 2017 um 20:36 Uhr

Benutzeravatar von Ron Nuni
Ron Nuni

Stellen Sie sicher, dass sich die Variable im oberen Teil des Blocks befindet, und falls Sie sie mit kompilieren -ansi-pedanticstellen Sie sicher, dass es so aussieht:

function() {
    int i;
    i = 0;

    someCode();
}

Benutzeravatar von vmsnomad
vmsnomad

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

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

  • Wenn kein Fehler vorliegt, kann es sich um eine C-Standard-Erzwingung/Compile-Flags ODER … etwas anderes handeln.

Deklarieren Sie die Variable in jedem Fall am Anfang des aktuellen Gültigkeitsbereichs. Sie können es dann separat initialisieren. In der Tat, wenn diese Variable einen eigenen Gültigkeitsbereich verdient, begrenzen Sie ihre Definition in {}.

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

-Wdeclaration-after-statement Minimal reproduzierbares Beispiel

Haupt c

#!/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

Warnung geben:

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

Nicht warnen:

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.

Stellen Sie sicher, dass Sie Ihre Erklärungen vor allen Erklärungen im Block abgegeben haben. Zum Beispiel:

{
int i = 0;
printf("a string");/*the code is not a working code*/
}

Ich glaube, das sollte hilfreich sein:

https://www.configrouter.com/iso-c90-forbids-mixed-declarations-and-code-in-c-30621/

1420660cookie-checkISO C90 verbietet gemischte Deklarationen und Code in C

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

Privacy policy