web-dev-qa-db-ja.com

ISO C90は、Cでの宣言とコードの混合を禁止しています

この方法で変数を宣言しました:

int i = 0;

警告が表示されます:

ISO C90は、宣言とコードの混合を禁止しています

どうすれば修正できますか?

65
user707549

変数宣言をブロックの先頭に移動する必要があると思います。つまり.

{
    foo();
    int i = 0;
    bar();
}

{
    int i = 0;
    foo();
    bar();
}
101
Johan Kotlinski

C99標準まで、すべての宣言はブロック内のステートメントの前に来なければなりませんでした。

void foo()
{
  int i, j;
  double k;
  char *c;

  // code

  if (c)
  {
    int m, n;

    // more code
  }
  // etc.
}

C99では、宣言とステートメントを混在させることができました(C++など)。多くのコンパイラは依然としてデフォルトでC89を使用しており、一部のコンパイラ(Microsoftなど)はC99 at)をサポートしていません。

そのため、次のことを行う必要があります。

  1. コンパイラがC99以降をサポートしているかどうかを判断します。含まれている場合は、C89ではなくC99をコンパイルするように構成します。

  2. コンパイラがC99以降をサポートしていない場合、doesをサポートする別のコンパイラを見つけるか、すべての宣言がブロック内のステートメントの前に来るようにコードを書き換える必要があります。

27
John Bode

コンパイラを使用する(または必要な引数を指定する)だけで、最新バージョンのC標準(C99またはC11)用にコンパイルします。たとえば、-std=c99になるGCCコンパイラファミリの場合。

10
Jens Gustedt

変数がブロックの上部にあることを確認し、-ansi-pedanticを使用してコンパイルする場合は、次のようになります。

function() {
    int i;
    i = 0;

    someCode();
}
3
Ron Nuni

実際にエラーを引き起こす原因を診断するには、最初に= 0を削除しようとします

  • エラーが発生した場合、ほとんどの場合、宣言はコードの後に​​なります。

  • エラーがない場合は、C標準の強制/コンパイルフラグOR ...何か他のものに関連している可能性があります。

いずれにしても、現在のスコープの先頭で変数を宣言します。その後、個別に初期化できます。実際、この変数が独自のスコープに値する場合は、{}で定義を区切ります。

OPがコンテキストを明確にできる場合、より指示された応答が続きます。

2
vmsnomad

-Wdeclaration-after-statement最小限の再現可能な例

#!/usr/bin/env bash

set -eux

cat << EOF > main.c
#include <stdio.h>

int main(void) {
    puts("hello");
    int a = 1;
    printf("%d\n", a);
    return 0;
}
EOF

# Give warning.
! gcc -std=c89 -Wdeclaration-after-statement -Werror main.c
! gcc -std=c99 -Wdeclaration-after-statement -Werror main.c
! gcc -std=c89 -pedantic -Werror main.c

# Don't give warning.
gcc -std=c89 -pedantic -Wno-declaration-after-statement -Werror main.c
gcc -std=c89 -Wno-declaration-after-statement -Werror main.c
gcc -std=c99 -pedantic -Werror main.c
gcc -std=c89 -Wall -Wextra -Werror main.c
# https://stackoverflow.com/questions/14737104/what-is-the-default-c-mode-for-the-current-gcc-especially-on-ubuntu/53063656#53063656
gcc -pedantic -Werror main.c

警告:

main.c: In function ‘main’:
main.c:5:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
     int a = 1;
     ^~~

Ubuntu 16.04、GCC 6.4.0でテスト済み。