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


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

int i = 0;

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

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

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

5 51

5 ответов:

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

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

до

{
    int i = 0;
    foo();
    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 на всех.

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

  1. определите, поддерживает ли ваш компилятор C99 или более позднюю версию; если это так, настройте его так, чтобы он компиляция C99 вместо C89;

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

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

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

function() {
    int i;
    i = 0;

    someCode();
}

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

  • Если ошибка срабатывает, то, скорее всего, объявление идет после кода.

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

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

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