93

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

int i = 0;

警告が表示されます:

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

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

4

6 に答える 6

146

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

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

{
    int i = 0;
    foo();
    bar();
}
于 2012-11-08T14:53:40.873 に答える
41

C99 標準までは、すべての宣言はブロック内のステートメントの前に置く必要がありました。

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

  // code

  if (c)
  {
    int m, n;

    // more code
  }
  // etc.
}

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

したがって、次のことを行う必要があります。

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

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

于 2012-11-08T16:22:06.387 に答える
11

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

于 2012-11-08T15:46:03.050 に答える
2

何が実際にエラーを引き起こすのかを診断するために、私は最初に削除しようとします= 0

  • エラーが発生した場合、宣言はコードの後に​​続く可能性があります。

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

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

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

于 2012-11-08T23:48:15.180 に答える
1

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

main.c

#!/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

警告を与える:

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

警告を出さない:

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 でテスト済み。

于 2018-10-30T12:16:29.467 に答える