「staticな話」(2006/01/10 (火) 00:25:46) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
C言語にはstaticという修飾子がある。
これって結構便利な修飾子なんだけど、つかう場面によってすこしずつ意味合いが異なるのがいやらしい気がする。
①ローカル変数の場合
これはもちろん、静的確保を意味する。関数を抜けても領域がキープされ、次回関数突入時には前回の値が残っている。
int Hoge(void)
{
static int i;
i++;
return i;
}
という関数があったとすると、この関数をコールするたびにiの値はひとつずつインクリメントされることになる。
まあ、常識??
②グローバル変数の場合
この場合は上とちょっと意味合いが異なってくる。
例えば
static int g_iHoge;
と宣言したグローバル変数を参照したり変更したりできるのは同一ファイルスコープ内に限られる。
③関数の場合
例えば、
static int hoge(void)
なんていう場合。
これも、この関数をコールできるのは同一ファイルスコープ内に限られる。
①は、わりとよく使われているから詳細は割愛するとして、②と③のstaticの使い方は、適切に使えば非常に有用だと思う。
外から参照されたくない変数や関数というのはあると思うからだ。
上手く使いこなせば、C言語でもオブジェクト指向の思想に近い安全性のあるコードを書くことができる。
また、staticとは別にconstという修飾子も存在する。
これは、この修飾子をつけた変数を定数として扱う(値の変更を禁止する)ということだ。
単純な定数はほとんどの場合#defineやenumを使って定義すればいいが、テーブルとして定義するグローバルな配列などは不用意に変更されたくない場合にconstを使う。
また、関数の引数などにもconstを使用して、引数のIn/Outを明確にして、Inの引数の値を変更しないことを保障してやるのも有効だ。
これらの修飾子を有効に使いこなせば、よりセキュアなコードになると思う。
C言語にはstaticという修飾子がある。
これって結構便利な修飾子なんだけど、つかう場面によってすこしずつ意味合いが異なるのがいやらしい気がする。
①ローカル変数の場合
これはもちろん、静的確保を意味する。関数を抜けても領域がキープされ、次回関数突入時には前回の値が残っている。
int Hoge(void)
{
static int i;
i++;
return i;
}
という関数があったとすると、この関数をコールするたびにiの値はひとつずつインクリメントされることになる。
まあ、常識??
②グローバル変数の場合
この場合は上とちょっと意味合いが異なってくる。
例えば
static int g_iHoge;
と宣言したグローバル変数を参照したり変更したりできるのは同一ファイルスコープ内に限られる。
③関数の場合
例えば、
static int hoge(void)
なんていう場合。
これも、この関数をコールできるのは同一ファイルスコープ内に限られる。
①は、わりとよく使われているから詳細は割愛するとして、②と③のstaticの使い方は、適切に使えば非常に有用だと思う。
外から参照されたくない変数や関数というのはあると思うからだ。
上手く使いこなせば、C言語でもオブジェクト指向の思想に近い安全性のあるコードを書くことができる。
また、staticとは別にconstという修飾子も存在する。
これは、この修飾子をつけた変数を定数として扱う(値の変更を禁止する)ということだ。
単純な定数はほとんどの場合#defineやenumを使って定義すればいいが、テーブルとして定義するグローバルな配列などは不用意に変更されたくない場合にconstを使う。
また、関数の引数などにもconstを使用して、引数のIn/Outを明確にして、Inの引数の値を変更しないことを保障してやるのも有効だ。
これらの修飾子を有効に使いこなせば、よりセキュアなコードになると思う。
なぜか、これらの修飾子ってあんまり使われていない。結構、便利だし安全なコードが書けると思うのに。
ぜひ、有効活用しましょう。
表示オプション
横に並べて表示:
変化行の前後のみ表示: