-

Machine Dependencies

提供: HI-TECH C for CP/M Fan WIKI(JP)
移動先: 案内検索

機種依存

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 */