warning: declaration shadows a variable in the global scope
警告:宣言が外部変数を隠す
[-Wshadow]
■この記事の概要
この記事では、C言語で外部変数に短い名前(例: i
, j
, k
)を付けるリスクを解説しています。短い名前は意図しない参照やスコープの混乱を招きやすいため、グローバル変数には明確で説明的な名前を使用することが推奨されています。具体例を交え、C89からC99への移行期によく見られるバグについても触れています。
■i,j,k等を外部変数で宣言してはいけない
int i = 5678;//★ダメ
#include <stdio.h>
int main(void)
{
for(int i = 0 ;i < 1234;i++){
;
}
printf("%d\n",i);//予期しない i を参照する
}
グローバル変数(global変数)/外部変数/広域変数
これらの変数は使わないに越したことはありませんが
どうしても使う場合は充分に「わかりやすい名前」を付けましょう。
これらの外部変数に汎用的な短い名前i,j,kは
みんなに見られて恥ずかしいので付けてはいけません。
局所変数が適切な物を外部変数で宣言するのは止めましょう。
上記の例では8行目で i を参照した際、1234が表示される事を期待して、1行目の 5678 を表示してしまいます。
■C89からC99への過渡期に注意
#include <stdio.h>
#define MAX 1024
int inf[MAX] = {0};
int main(void) {
int i = 0 ; //★1
//
//~
//
for(int i = 0 ;i < MAX ;i++){//★2
if(inf[i] != 0)
break;
}
if(i >= MAX) //★2を見るつもりで★1を見てしまう
printf("Found %d",i);
else
printf("Not Found %d",i);
}
上記はC89スタイルからC99スタイルへの過渡期に
よく起きるバグです。
for文で宣言した i を参照するつもりで
関数先頭で宣言した i を参照しています。
参考:
https://www.jpcert.or.jp/sc-rules/c-dcl01-c.html
Linux カーネル コーディング規約
https://linuxjf.osdn.jp/JFdocs/kernel-docs-2.6/CodingStyle.html
(中略)
グローバル変数には意味がよく分かる名前を付けてください。
(中略)
ローカル変数の名前は短くて、変数の特徴を表したものにします。