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 中的有效源代码吗?
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
.
请注意,您不能将声明紧跟在标签之后(C11 §6.8.1 Labeled statements);您不能标记声明或跳转到声明。另见§6.8.2 复合语句、§6.7 声明和§6.9 外部定义。但是,您可以标记一个空语句,因此这不是主要问题:
label: ;
int a = 5;