Я объявил переменную таким образом:
int i = 0;
Получаю предупреждение:
ISO C90 запрещает смешанные декларации и код
Как я могу это исправить?
Я объявил переменную таким образом:
int i = 0;
Получаю предупреждение:
ISO C90 запрещает смешанные декларации и код
Как я могу это исправить?
-std=c99
).
Ответы:
Я думаю, вам следует переместить объявление переменной в начало блока. Т.е.
{
foo();
int i = 0;
bar();
}
к
{
int i = 0;
foo();
bar();
}
{foo(); {int i=0; bar();}}
Вплоть до стандарта C99 все объявления должны были стоять перед любыми операторами в блоке:
void foo()
{
int i, j;
double k;
char *c;
// code
if (c)
{
int m, n;
// more code
}
// etc.
}
C99 позволяет смешивать объявления и операторы (например, C ++). Многие компиляторы по- прежнему по умолчанию C89, и некоторые компиляторы (например, от Microsoft) не поддерживают C99 вообще .
Итак, вам нужно будет сделать следующее:
Определите, поддерживает ли ваш компилятор C99 или новее; если это так, настройте его так, чтобы он компилировал C99 вместо C89;
Если ваш компилятор не поддерживает C99 или более позднюю версию, вам нужно будет либо найти другой компилятор, который поддерживает его, либо переписать код, чтобы все объявления располагались перед любыми операторами в блоке.
Просто используйте компилятор (или предоставьте ему необходимые аргументы), чтобы он компилировался для более новой версии стандарта C, C99 или C11. Например, для семейства компиляторов GCC это будет -std=c99
.
-std=gnu89
используется при компиляции модулей ядра Linux.
Убедитесь, что переменная находится в верхней части блока, и, если вы компилируете ее -ansi-pedantic
, убедитесь, что она выглядит так:
function() {
int i;
i = 0;
someCode();
}
Чтобы определить, что действительно вызывает ошибку, я бы сначала попытался удалить = 0
Если произошла ошибка, то, скорее всего, объявление идет после кода.
Если ошибок нет, то это может быть связано с флагами принуждения / компиляции C-стандарта ИЛИ ... чем-то еще.
В любом случае объявите переменную в начале текущей области видимости. Затем вы можете инициализировать его отдельно. В самом деле, если эта переменная заслуживает отдельной области видимости - ограничьте ее определение в {}.
Если OP сможет прояснить контекст, то последует более направленный ответ.
-Wdeclaration-after-statement
минимальный воспроизводимый пример
main.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
Предупредить:
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
Не предупреждать:
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
Предупреждение:
main.c: In function ‘main’:
main.c:5:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
int a = 1;
^~~
Проверено на Ubuntu 16.04, GCC 6.4.0.
-pedantic
или-std=c89
, и в этом случае вы можете скомпилировать,-std=gnu99
если хотите.