Позволяет ли 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 ответа:
Да. Это уже действовало в 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
.