型修飾子
const 修飾子
const 修飾子は,定数を宣言するために使用します。
const 修飾された型の変数は,代入による値の変更が禁止されます。
定数の役割をする変数に const 修飾子を付けておくことで,意図せぬ値の代入をコンパイル時に検出することができます。
int main(void)
{
const int a = 123;
a = 456; /* 不可 */
return 0;
}
const 修飾子は,C の拡張として作られた言語である C++ から逆輸入されたものです。
C++ 側の const 修飾子についての詳しい解説は C++ ウォークスルー をお読みください。
定数を定義する方法には,const 修飾子を利用する方法と,マクロ定数 (「プリプロセッサ」参照) を利用する方法があります。
const 定数は型検査の恩恵を受けられるという利点があるため,どちらの方法でもよいというケースでは const 定数の利用を検討するとよいでしょう。
volatile 修飾子
volatile 修飾子は,その名前の通り,値が変わりやすい変数であることを示すために使われる修飾子です.
組込み系プログラムで信号ピンでに割り当てる変数や,マルチスレッドプログラムにおいてスレッド間で共有する変数などに使います.
volatile 修飾された型の変数は,コンパイラによる最適化が抑制されます。
次のプログラムは,volatile 修飾子を使ったプログラムの例です。
最初の代入文 *pio0 = 0x01; は一見不要に思えますが,組込み系ソフトウェアでは値の変更が意味を持つことがあります。
最適化によってこの文が削除されるのを防ぐために,volatile 修飾子が必要となります。
int main(void)
{
volatile char *pio0 = (char *) 0x00001000; /* 信号ピン */
*pio0 = 0x01;
*pio0 = 0x02;
return 0;
}
仮に,変数 pio0 に volatile 修飾子をつけなかったとすると,コンパイラは意味のない代入文 *pio0 = 0x01; を省略して,プログラムを以下のように最適化してしまうかもしれません。
int main(void)
{
volatile char *pio0 = (char *) 0x00001000; /* 信号ピン */
*pio0 = 0x02;
return 0;
}