Declaro una variable de esta manera:
int i = 0;
Recibo la advertencia:
ISO C90 prohíbe declaraciones y códigos mixtos
¿Cómo puedo arreglarlo?
Declaro una variable de esta manera:
int i = 0;
Recibo la advertencia:
ISO C90 prohíbe declaraciones y códigos mixtos
¿Cómo puedo arreglarlo?
-std=c99
) mixtos .
Respuestas:
Creo que debería mover la declaración de variable a la parte superior del bloque. Es decir
{
foo();
int i = 0;
bar();
}
a
{
int i = 0;
foo();
bar();
}
{foo(); {int i=0; bar();}}
Hasta el estándar C99, todas las declaraciones tenían que ir antes de cualquier declaración en un bloque:
void foo()
{
int i, j;
double k;
char *c;
// code
if (c)
{
int m, n;
// more code
}
// etc.
}
C99 permitió mezclar declaraciones y sentencias (como C ++). Muchos compiladores todavía utilizan C89 de forma predeterminada, y algunos compiladores (como el de Microsoft) no admiten C99 en absoluto .
Por lo tanto, deberá hacer lo siguiente:
Determine si su compilador admite C99 o posterior; si es así, configúrelo para que compile C99 en lugar de C89;
Si su compilador no es compatible con C99 o posterior, necesitará encontrar un compilador diferente que lo admita o reescribir su código para que todas las declaraciones vengan antes de cualquier declaración dentro del bloque.
Simplemente use un compilador (o proporcione los argumentos que necesita) de modo que compile para una versión más reciente del estándar C, C99 o C11. Por ejemplo, para la familia de compiladores GCC que sería -std=c99
.
-std=gnu89
se utiliza al compilar módulos del kernel de Linux.
Asegúrese de que la variable esté en la parte superior del bloque y, en caso de que la compile -ansi-pedantic
, asegúrese de que se vea así:
function() {
int i;
i = 0;
someCode();
}
Para diagnosticar lo que realmente desencadena el error, primero intentaría eliminar = 0
Si se dispara el error, lo más probable es que la declaración vaya después del código.
Si no hay error, entonces puede estar relacionado con indicadores de compilación / cumplimiento del estándar C O ... algo más.
En cualquier caso, declare la variable al comienzo del ámbito actual. Luego puede inicializarlo por separado. De hecho, si esta variable merece su propio alcance, delimite su definición en {}.
Si el PO pudiera aclarar el contexto, se seguiría una respuesta más dirigida.
-Wdeclaration-after-statement
ejemplo mínimo reproducible
C Principal
#!/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
Dar advertencia:
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
No advierta:
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
La advertencia:
main.c: In function ‘main’:
main.c:5:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
int a = 1;
^~~
Probado en Ubuntu 16.04, GCC 6.4.0.
-pedantic
o-std=c89
, en cuyo caso puede compilar-std=gnu99
si lo desea.