型修飾子

型修飾子 (type qualifier) は、変数の属性を指定します。

型修飾子説明
const 定数であることを示す
volatile この変数は自動的に変化する可能性がある
far, _far far メモリに置かれることを示す (非 ISO/JIS/ANSI)
near, _near near メモリに置かれることを示す (非 ISO/JIS/ANSI)

const

データを変更できないことを示します。この属性を指定した変数の値を変更しようとすると、エラーになります。

const int i = 1; // 初期化は可能
int const i2 = 1; // こう書いても同じ
i = 2; // エラー
char* const p = "A"; // 変更できないポインタ
const char* p2 = "A"; // 変更できないデータへのポインタ
char const* p3 = "A"; // 同上
p[0] = 0; // 有効
p2[0] = 0; // エラー
p = NULL; // エラー
p2 = NULL; // 有効

volatile

たとえば入力ポートを指す変数など、自動的に変化する可能性がある特殊な変数に対して指定します。これにより、変数値の不変性を前提とした最適化が抑止されます。volatile 変数はレジスタ変数にはなりません。

far と near

8086 系の 16 ビット システムでは、セグメント レジスタに関連して、ポインタ (アドレス) に far と near の区別があります。「メモリ モデル」も参照してください。

次は、near モデルでの例です。

int i1[100]; // near メモリに置かれる
int near i2[100]; // near メモリに置かれる
int far i3[100]; // far メモリに置かれる
far int i4[100]; // far メモリに置かれる
void far func() { } // far メモリに置かれるコード
int* p1; // near メモリに置かれる near ポインタ
int far* p2; // near メモリに置かれる far ポインタ
far int* p3; // 同上
int* far p4; // far メモリに置かれる near ポインタ
int far* far p5; // far メモリに置かれる far ポインタ
int far** p6; // far ポインタへの near ポインタ (near メモリ上)
int* far* p7; // near ポインタへの far ポインタ (near メモリ上)

near ポインタは 2 バイトで高速ですが、near メモリにあるデータしか指すことができません。far ポインタは 4 バイトで低速ですが、near メモリにあるデータと、far メモリにあるデータの両方を指すことができます。

syscall、stdcall、pascal

関数専用です。「関数呼び出し規約」を参照してください。

interrupt

関数専用です。「割り込みハンドラ」を参照してください。