C11是否允许函数中任何位置的变量声明?

Ami*_*yan 3 c variable-declaration 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;
}
Run Code Online (Sandbox Code Playgroud)

它是C11中的有效源代码吗?

rub*_*nvb 8

是.这在C99中已经有效(参见此处的第二个项目符号).


Jon*_*ler 5

或多或少。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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能还会注意到 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;
Run Code Online (Sandbox Code Playgroud)