次: 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を使うことだ。