私はこのように変数を宣言しました:
int i = 0;
警告が表示されます:
ISO C90は、宣言とコードの混合を禁止しています
どうすれば修正できますか?
私はこのように変数を宣言しました:
int i = 0;
警告が表示されます:
ISO C90は、宣言とコードの混合を禁止しています
どうすれば修正できますか?
-std=c99
)。
回答:
変数宣言をブロックの先頭に移動する必要があると思います。つまり、
{
foo();
int i = 0;
bar();
}
に
{
int i = 0;
foo();
bar();
}
{foo(); {int i=0; 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
。
-std=gnu89
は、Linuxカーネルモジュールをコンパイルするときに使用されます。
-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、GCC6.4.0でテスト済み。
-pedantic
またはのように聞こえます。-std=c89
その場合は、必要に-std=gnu99
応じてコンパイルできます。