この方法で変数を宣言しました:
int i = 0;
警告が表示されます:
ISO C90 は宣言とコードの混在を禁止しています
どうすれば修正できますか?
変数宣言をブロックの先頭に移動する必要があると思います。つまり
{
foo();
int i = 0;
bar();
}
に
{
int i = 0;
foo();
bar();
}
C99 標準までは、すべての宣言はブロック内のステートメントの前に置く必要がありました。
void foo()
{
int i, j;
double k;
char *c;
// code
if (c)
{
int m, n;
// more code
}
// etc.
}
C99 では、宣言とステートメントを混在させることができました (C++ など)。多くのコンパイラは依然として C89 をデフォルトとしており、一部のコンパイラ (Microsoft など) は C99をまったくサポートしていません。
したがって、次のことを行う必要があります。
コンパイラが C99 以降をサポートしているかどうかを確認します。その場合は、C89 ではなく C99 をコンパイルするように構成します。
コンパイラが C99 以降をサポートしていない場合は、それをサポートする別のコンパイラを見つけるか、すべての宣言がブロック内のステートメントの前に来るようにコードを書き直す必要があります。
コンパイラーを使用して(または必要な引数を指定して)、C標準の最新バージョンであるC99またはC11用にコンパイルしてください。たとえば、GCCファミリのコンパイラの場合は-std=c99
。
何が実際にエラーを引き起こすのかを診断するために、私は最初に削除しようとします= 0
エラーが発生した場合、宣言はコードの後に続く可能性があります。
エラーがない場合は、C標準の強制/コンパイルフラグまたは...他の何かに関連している可能性があります。
いずれの場合も、現在のスコープの先頭で変数を宣言します。その後、個別に初期化できます。実際、この変数が独自のスコープに値する場合は、{}でその定義を区切ります。
OPがコンテキストを明確にできる場合は、より指示された応答が続きます。
-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 でテスト済み。