私は一般的に次のようなコードを避けたいです:
#include <stdio.h>
int main(int argc, char *argv[]){
int n = 3;
for (int n = 1; n <= 10; n++){
printf("%d\n", n);
}
printf("%d\n", n);
}
どうすればそのような変数の使用法を見つけることができますか?つまり、同じ関数で「よりローカルな」変数はよりグローバルな変数と同じ名前を持っているということですか?
C-標準:C 99
Gccとclangはどちらも、相互にシャドウする変数について警告する-Wshadow
フラグをサポートしています。たとえば、コードに対してgcc
から受け取る警告は次のとおりです。
warning: declaration of ‘n’ shadows a previous local [-Wshadow]
for (int n = 1; n <= 10; n++){
^
warning: shadowed declaration is here [-Wshadow]
int n = 3;
^
gcc
はフラグを文書化します ここ そして言います:
ローカル変数または型宣言が別の変数、パラメーター、型、クラスメンバー(C++の場合)、またはインスタンス変数(Objective-Cの場合)をシャドウするとき、または組み込み関数がシャドウされるときはいつでも警告します。 C++では、ローカル変数が明示的なtypedefをシャドウしている場合は警告しますが、struct/class/enumをシャドウしている場合は警告しません。
Visual Studioでは、これは以前は不可能だったように見えますが、 最近のバージョンでは修正されているようです 。
私が最初にそれを見たとき、私はこれを疑ったので、私は自分自身で見なければなりませんでした、あなたはあなたがこれらの警告をすぐに受け取らないと私に言っていますか?
これは、-stdコンパイラフラグのないgcc(C90モード)を使用していることを前提としています。
rootavish@themachine /tmp $ gcc queer.c -oueer
queer.c: In function ‘main’:
queer.c:7:12: error: redefinition of ‘n’
for (int n = 1; n <= 10; n++){
^
queer.c:5:7: note: previous definition of ‘n’ was here
int n = 3;
^
queer.c:7:3: error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int n = 1; n <= 10; n++){
^
queer.c:7:3: note: use option -std=c99 or -std=gnu99 to compile your code
コンパイラフラグを指定できますか?