次: Internationalization, 前: CPU Portability, 上: Writing C
Cの実装は十分に違う。ansi Cは非互換性を減らすが、無くなりはしない。 その一方では、多くのユーザがGNUソフトウェアをansi以前のコンパイラで コンパイルしたがる。この章では、移植性を不必要に失くさないよう、標準Cラ イブラリ関数をどれぐらいたくさん、あるいは、少なく使うか、推奨する方法を 見せる。
sprintf
の値を使ってはいけない。あるシステムでは書かれた文字の数を
返し、すべてのシステムでそうだというわけではない。
main
はint
型を返すと宣言するべきだ。それはexit
を呼ぶ
か、整数状態コードを返すことによって終了するべきだ。決して未定義の値を返
すことができないようにしなさい。
あるシステムでは、システム関数の宣言はほとんどが間違っている。衝突を最小 化するために、システム関数を宣言するのをシステムのヘッダファイルに任せな さい。もしヘッダが関数を宣言しなければ、宣言せずに置いておきなさい。
関数を宣言せずに使うのはきれいじゃないように見えるかもしれないが、実際に はこれが本当に起こるシステム上の、ほとんどのシステムライブラリ関数に対し て上手く働く。対照的に、現実の宣言は頻繁に現実の衝突を引き起こしている。
malloc
やrealloc
を宣言してはいけない。
ほとんどのGNUプログラムは、慣習的にxmalloc
やxrealloc
と名付
けられる関数の中で、たった一回だけそれらを使用する。これらの関数はそれぞ
れmalloc
やrealloc
を呼び、結果を確認する。
xmalloc
やxrealloc
はあなたのプログラムで定義されるので、型
の衝突の危険性なしに他のファイルにそれらを宣言できる。
ほとんどのシステム上で、int
はポインタと同じ長さだ。それゆえ、
malloc
やrealloc
の呼び出しは上手く動く。数少ない例外的なシ
ステム(ほとんどは64ビット・マシン)では、malloc
やrealloc
の
条件付き宣言を使うか、これらの宣言をそれらのシステムに特化した
設定ファイルに置くことができる。
このことは、あなたが思うよりも問題を起こさない。多くのシステムがまだサポー トしていないので、いずれにせよ、新しいansi文字列関数は避ける べきだ。使って良い文字列関数は次の通りだ。
strcpy strncpy strcat strncat strlen strcmp strncmp strchr strrchr
複製や連結の関数は、それらの値を使わない限り、宣言なしで上手く働く。宣言
なしにそれらの値を使うと、ポインタの大きさがint
の大きさと違うシス
テムや、おそらく他の場合に失敗する。それらの値を使うのを避けるのはささい
なことだから、そうしなさい。
比較の関数やstrlen
は、ほとんどのシステムで、おそらくGNUソフトウェ
アが動くすべてのシステムで、宣言なしに上手く働く。少数のシステムで
条件付きでそれらを宣言することが必要だと気付くかもしれない。
検索関数はchar *
を返すと宣言されなければならない。幸運にも、それ
らが返すデータ型には多様性がない。しかしそれらの名前には多様性がある。あ
るシステムでは、それらの関数にindex
とrindex
という名前を付
けている。他のシステムでは、strchr
とstrrchr
という名前を使
う。あるシステムは両方の名前をサポートするが、どっちも全てのシステムで働
くわけではない。
片方の組の名前を取り出し、プログラム中でそれを使うべきだ。(今日では、新
しいプログラムにはstrchr
とstrrchr
を選ぶのがより良い。それ
らは標準のansi名だから。) それらの名前を両方ともchar *
を返す
関数として宣言しなさい。それらの名前をサポートしないシステムでは、他方の
組のことばをマクロとして定義しなさい。例えば、strchr
と
strrchr
の名前を通して使いたいなら、ファイルの始め(あるいはヘッダ
に)次のように書いておく。
#ifndef HAVE_STRCHR #define strchr index #endif #ifndef HAVE_STRRCHR #define strrchr rindex #endif char *strchr (); char *strrchr ();
ここでは、HAVE_STRCHR
とHAVE_STRRCHR
が対応する関数が存在す
るシステムでは定義されるマクロだとみなしている。それらを適切に定義する一
つのやり方はAutoconfを使うことだ。