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?
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?
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:
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;
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
Ron Nuni
Stellen Sie sicher, dass sich die Variable im oberen Teil des Blocks befindet, und falls Sie sie mit kompilieren -ansi-pedantic
stellen Sie sicher, dass es so aussieht:
function() {
int i;
i = 0;
someCode();
}
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/
Klingt nach GCC
-pedantic
oder-std=c89
in 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