Позволяет ли C11 объявлять переменные в любом месте функции?


Позволяет ли стандарт C11 (заметьте, я не имею в виду C++11) объявлять переменные в любом месте функции?

Приведенный ниже код недопустим в ANSI C (C89, C90):

int main()
{
  printf("Hello world!");
  int a = 5; /* Error: all variables should be declared at the beginning of the function. */
  return 0;
}

Допустим ли исходный код в C11?

2 3

2 ответа:

Да. Это уже действовало в C99 (см. второй патрон здесь).

Более или менее. C99 ввел возможность объявлять переменные частично через блок и в первом разделе цикла for, и C2011 продолжил это.

void c99_or_later(int n, int *x)
{
    for (int i = 0; i < n; i++)  // C99 or later
    {
         printf("x[%d] = %d\n", i, x[i]);
         int t = x[i];           // C99 or later
         x[0] = x[i];
         x[i] = t;
    }
}

Вы также можете заметить, что хвостовые комментарии стиля C++ также допустимы только в C99 или более поздней версии.

Если вам приходится иметь дело с компиляторами C, которые не совместимы с C99 (например, MSVC), то вы не можете использовать эти (удобные) обозначения. GCC предоставляет вам полезный предупреждающий флаг: -Wdeclaration-after-statement.