web-dev-qa-db-ja.com

変数がシャドウされると警告が表示されます

私は一般的に次のようなコードを避けたいです:

#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

12
Ystar

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では、これは以前は不可能だったように見えますが、 最近のバージョンでは修正されているようです

14
Shafik Yaghmour

私が最初にそれを見たとき、私はこれを疑ったので、私は自分自身で見なければなりませんでした、あなたはあなたがこれらの警告をすぐに受け取らないと私に言っていますか?

これは、-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

コンパイラフラグを指定できますか?

0
rootavish