Подтвердить что ты не робот

ISO C90 запрещает смешанные декларации и код в C

Я объявила переменную таким образом:

int i = 0;

Я получаю предупреждение:

ISO C90 запрещает смешанные декларации и код

Как я могу это исправить?

4b9b3361

Ответ 1

Я думаю, вы должны перенести объявление переменной в верхнюю часть блока. То есть.

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

к

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

Ответ 2

До стандарта C99 все объявления должны были появляться перед любыми утверждениями в блоке:

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

  // code

  if (c)
  {
    int m, n;

    // more code
  }
  // etc.
}

C99 разрешено смешивать объявления и утверждения (например, С++). Многие компиляторы по-прежнему используют C89, а некоторые компиляторы (например, Microsoft) вообще не поддерживают C99.

Итак, вам нужно будет сделать следующее:

  • Определите, поддерживает ли ваш компилятор C99 или новее; если это так, настройте его так, чтобы он компилировал C99 вместо C89;

  • Если ваш компилятор не поддерживает C99 или более позднюю версию, вам нужно либо найти другой компилятор, который его поддерживает, либо переписать код, чтобы все объявления приходили перед любыми операторами внутри блока.

Ответ 3

Просто используйте компилятор (или укажите его с необходимыми аргументами), чтобы он компилировался для более новой версии стандарта C, C99 или C11. Например, для компиляторов семейства GCC, которые были бы -std=c99.

Ответ 4

Убедитесь, что переменная находится в верхней части блока, и если вы скомпилируете ее с помощью -ansi-pedantic, убедитесь, что она выглядит так:

function() {
    int i;
    i = 0;

    someCode();
}

Ответ 5

Чтобы диагностировать, что действительно вызывает ошибку, я бы сначала попытался удалить = 0

  • Если ошибка сработала, то, скорее всего, объявление будет следовать за кодом.

  • Если нет ошибки, то это может быть связано с C-стандартными флагами принудительного исполнения/компиляции OR... что-то еще.

В любом случае объявите переменную в начале текущей области. Затем вы можете инициализировать его отдельно. Действительно, если эта переменная заслуживает своей собственной области действия - разделите ее определение на {}.

Если OP может прояснить контекст, тогда последует более направленный ответ.