-
Machine Dependencies
機種依存
HI-TECH CはC言語の機種依存の姿勢を排除します。何故ならこの様な機能は一様に符号なしCHARとして実装されているからです??しかし、C言語の機種依存性が継承され、これが存在する領域があります。プログラマーはこれに気をつけ、移植性の高いコードを書く時には考慮にいれなければいけません。
この機種依存性の典型はCの型のサイズに潜んでいます。ある機種では16bitであるのに、他方では32bitだったりします。HI-TECH CはほとんどのCコンパイラで共通作法??とされる次のルールに従います。
- char
- 少なくとも8bit
- short
- 少なくとも16bit
- long
- 少なくとも32bit
- int
- shortかlongのいずれかと同じ
- float
- 少なくとも32bit
- double
- 少なくともfloatと同じ
INTの幅と同じ幅の値のため、shortもしくはlongは可能であればintに優先して使うことをお勧めします。この例外は、その機種に固有のワードサイズに対応する必要がある場合です。
機種の違いがある、他の部分はバイトの並びです。shortやlongのバイトの並びは機種間で明らかに様々です。特定の並びに、対する依存をしないコードを避ける以外には、この問題に対する簡単なアプローチはありません。ファイルを同じプログラムから呼び出すことなく削除して??構造体全体を(fwrite())を介して)ファイルに書き出すことは避けてください。異なるコンパイラでは異なるパディングを構造体メンバの間で使います。これは#pragma pack(n)構造体を介して変更が可能です。
事前定義済みマクロ
避けられない機種の依存性を取り扱うテクニックの1つはおそらく、それぞれのコンパイラで提供される、ターゲットプロセッサや(もしあれば)オペレーションシステムを特定するための事前定義済みマクロです。これらはコンパイラドライバによって定義され、条件コンパイルプリプロセッサディレクティブにテストされます。
多くのコンパイラで定義されているマクロのリストを表2に挙げます。これらは例にも使われています。
i8051 | 8051 processor family |
i8086 | 8086 processor family |
i8096 | 8096 processor family |
z80 | Z80 processor and derivatives |
m68000 | 68000 processor family |
m6800 | 6801, 68HC11 and 6301 processors |
m6809 | 6809 processor |
DOS | MS-DOS and PC-DOS |
CPM | CP/M-80 and CP/M-86 |
TOS | Atari ST |
- 表2.事前定義済みマクロ
#if DOS char * filename = "c:file"; #endif /* DOS */ #if CPM char * filename = "0:B:afile"; #endif /* CPM */