4

Does the C11 standard (note I don't mean C++11) allow you to declare variables at any place in a function?

The code below is not valid in 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;
}

Is it valid source code in C11?

4

2 に答える 2

10

Yes. This was already valid in C99 (see the second bullet here).

于 2012-10-28T17:08:49.933 に答える
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;
    }
}

また、C++ スタイルのテール コメントも C99 以降でのみ有効であることに注意してください。

C99 に準拠していない C コンパイラ (MSVC など) を扱う必要がある場合、これらの (便利な) 表記法は使用できません。GCC は便利な警告フラグを提供します: -Wdeclaration-after-statement.

ラベルの直後に宣言を入れることはできないことに注意してください (C11 §6.8.1 ラベル付きステートメント)。宣言にラベルを付けたり、宣言にジャンプしたりすることはできません。§6.8.2 複合ステートメント§6.7 宣言、および§6.9 外部定義も参照してください。ただし、空のステートメントにラベルを付けることができるため、大きな問題にはなりません。

label: ;
    int a = 5;
于 2012-10-28T17:10:58.190 に答える