グローバル変数が本当に 1 つの関数でのみ使用されている場合、それらがグローバルであるという事実により、それらを使用する関数が再入不可になるため、それらを静的ローカル変数にすることによって何も失うことはありません。変数のスコープを制限することで、少し得をします。
1 つの関数だけで使用されているすべてのグローバルにその変更を加えてから、各静的ローカル変数を調べて、非静的 (自動) にできるかどうかを確認する必要があります。
ルールは次のとおりです。変数が設定される前に関数で使用されている場合は、静的のままにします。
自動ローカルにできる変数の例 (int nplus4;
関数内に " " を配置します (ゼロに設定する必要はありません。使用前に設定されているため、設定前に実際に使用すると警告が表示されます) 、便利なチェック):
int nplus4 = 0; // used only in add5
int add5 (int n) {
nplus4 = n + 4; // set
return nplus4 + 1; // use
}
nplus4
var は使用前に設定されます。static int nextn = 0;
次の例は、関数内に " " を入れて静的にしておく必要があります。
int nextn = 0; // used only in getn
int getn (void) {
int n = nextn++; // use, then use, then set
return n;
}
注意が必要な場合があります。" nextn++
" は設定ではなく、" " と同等であるため、使用および設定nextn = nextn + 1
です。
注意すべきもう 1 つの点: RTOS 環境では、スタック スペースがグローバル メモリよりも制限されている可能性があるため、" char buffer[10000]
" などの大きなグローバルを関数に移動する場合は注意してください。