GNUシステムでさえ、cpuタイプ間の違いのせいで異なってしまうだろう。—
例えば、バイト順序や境界の必要性の違いなどだ。こういう違うを扱うことは絶
対に不可欠だ。しかし、int
が32ビットより小さい可能性を扱うために努
力してはいけない。GNUでは16ビットのマシンはサポートしない。
int
オブジェクトのアドレスがまたその一番下のバイトのアドレスである
とみなしてはいけない。これはビッグ・エンディアンのマシンでは誤りだ。だか
ら、次の間違いをしてはいけない。
int c; ... while ((c = getchar()) != EOF) write(file_descriptor, &c, 1);
関数を呼ぶとき、さまざまな型のポインタ間やポインタと整数間での違いを心配 する必要はない。ほとんどのマシンでは、いずれにせよ違いはない。違いのある わずかなマシンについて言うと、それらの全てがansi Cをサポートしてい るので、それらのシステム上でそのコードが動くように、(ansi Cでだけ使 われるように条件付けされた)プロトタイプを使うことができる。
ある場合には、整数とポインタの引数を無差別に同じ関数へ渡し、いかなるシス
テムでもプロトタイプを使わないでも構わない。例えば、多くのGNUプログラム
はprintf
やその類いに引数をどんどん渡すエラー報告関数を持っている。
error (s, a1, a2, a3) char *s; int a1, a2, a3; { fprintf (stderr, "error: "); fprintf (stderr, s, a1, a2, a3); }
実際、これは全てのマシンで動作し、他の“正しい”やり方よりずっと単純だ。 そのような関数に対してプロトタイプを使うことをしないように。
しかしながら、本当に必要としているのでないなら、ポインタを整数にキャスト しないようにしなさい。これらの仮定は実に移植性を減らしており、ほとんどの プログラムでは簡単に避けられる。ポインタから整数にキャストすることが不可 欠な —アドレスだけでなく型情報をあるワードに収めるLispインタープリタ、の ような— 場合には、そうして構わないが、異なるワードサイズを扱う明示的な 準備をしなくてはならないだろう。