C言語 volatile,extern
volatile
コンパイラの最適化を防ぐ修飾子
volatile int flag;
のように使う。
int flag;
while(flag){
//flagに触らない処理
}
とした場合、flagをスイッチ等からの入力で操作してwhileから抜けようとしても、コンパイラの最適化により
if(flag){
while(1){
//flagに触らない処理
}
}
とされ、whileから抜けられなくなる(最適化により(一見)無駄な条件評価を省かれる)
修飾子volatileを付けておくことでこのような最適化をキャンセルできる。
extern
複数ソースコードで共有して使う変数、関数に付ける修飾子
extern int i;
のように使う
ヘッダーファイル内の宣言に修飾し、以降、どこかのソースファイルで定義された変数を、ヘッダーファイルをincludeしたソース全てで共有できる。
(普通にint i; とすると、宣言と同時に定義も行われてしまい、複数回の定義によりエラーが出る