この方法で変数を宣言しました:
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 at)をサポートしていません。
そのため、次のことを行う必要があります。
コンパイラがC99以降をサポートしているかどうかを判断します。含まれている場合は、C89ではなくC99をコンパイルするように構成します。
コンパイラがC99以降をサポートしていない場合、doesをサポートする別のコンパイラを見つけるか、すべての宣言がブロック内のステートメントの前に来るようにコードを書き換える必要があります。
コンパイラを使用する(または必要な引数を指定する)だけで、最新バージョンのC標準(C99またはC11)用にコンパイルします。たとえば、-std=c99
になるGCCコンパイラファミリの場合。
変数がブロックの上部にあることを確認し、-ansi-pedantic
を使用してコンパイルする場合は、次のようになります。
function() {
int i;
i = 0;
someCode();
}
実際にエラーを引き起こす原因を診断するには、最初に= 0
を削除しようとします
エラーが発生した場合、ほとんどの場合、宣言はコードの後になります。
エラーがない場合は、C標準の強制/コンパイルフラグOR ...何か他のものに関連している可能性があります。
いずれにしても、現在のスコープの先頭で変数を宣言します。その後、個別に初期化できます。実際、この変数が独自のスコープに値する場合は、{}で定義を区切ります。
OPがコンテキストを明確にできる場合、より指示された応答が続きます。
-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でテスト済み。