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中的有效源代码吗?

是。 这在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或更高版本中有效。

如果您必须处理不符合C99的C编译器(例如MSVC),那么您就不能使用这些(方便的)符号。 GCC为您提供了一个有用的警告标志: -Wdeclaration-after-statement