mis08のブログ

ハマったことの備忘録

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; とすると、宣言と同時に定義も行われてしまい、複数回の定義によりエラーが出る