The Man Who Fell From The Wrong Side Of The Sky:2013年11月11日分

[最新版] [一覧] [前月] [今月] [翌月]

2013/11/11(Mon)

[Unix C][*BSD][な闇深] sys/cdefs.hとは何ですか? (その1)

@ 誰も教えてくれない謎のヘッダファイル

sys/cdefs.hはUnix Cプログラミング初心者にとっては混乱の源です。

#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
static char sccsid[] = "@(#)abort.c     8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: abort.c,v 1.14 2011/05/18 19:36:36 dsl Exp $");
#endif
#endif /* LIBC_SCCS and not lint */

「お・ま・じ・な・い(滝川Christos)」と脈絡もなく突然includeされた後は、 初心者が書店で一番最初に手にするようなC言語本 *1には載っていない謎のマクロが延々と続きます。

うーんこのぐうの音も出ない畜生、これではソースを読もうというその意志いきなり挫かれますやね、そしてソースコードをVisualC++のIDEにコピペしてみれば

fatal error: sys/cdefs.h: No such file or directory

の無情なエラーメッセージが表示され、コンパイルすることすら許されないのか(絶句)。

@ いつものように歴史のお勉強

元々BSDの標準Cコンパイラは2.9BSDの頃から長らく pcc(Portable C Compiler)でしたが、4.3BSDの頃になると

といった理由でより優れたCコンパイラが求められるようになりました、前者だけならpccでも良かったんだろうけど。

そんなわけで 4.3BSD-Renoの頃よりシステム標準のCコンパイラを gcc(当時はGNU C Compilerの略、今はGNU Compiler Collection)に変更する作業がはじまり、 4.3BSD Net/2にて 完成します。

ここでpccはソースツリーから完全に取り除かれることとなります *7、ちなみにpccが再び*BSDのソースツリーに帰還するのは 16年後ですな、OpenBSDはもう飽きたようでさっさとツリーから消したけど、NetBSDでは まだある

まぁそんな努力も空しくその後( 震え声)

@ 這い回る混乱の唯一の生き残り

話を戻すとsys/cdefs.hは正にこの

を埋める為のportability layerとして 導入されました、要するにpccにあわせて書かれていたコードを書き直さずマクロの黒魔術でgccでもコンパイルできるようにしたってことです。

@ sys/cdefs.hのポータビリティは?

もちろんない(断言)、そもそもWindowsはまだしもSolarisとかにだってsys/cdefs.hはないんやで。

*BSD以外だとCygwinやglibc2にはあるけど、前者はNetBSDのlibcからforkしたnewlibをベースにしてるので有って当然。

後者についてはglibc2のコードを

The Regents of the University of California

でgrepすれば判るように、多くのコードをBSDから パチ移植しているので、移植の手間を省く為に用意してますやね。

まぁどれもある程度は同じマクロが使えるけど、完全に互換性があるわけではないので注意。

@ 次回は

実際にsys/cdefs.hの中身について解説する予定(確定とは言っていない)。


*1:著者名はお察しください
*2:VAXが衰退したとは露にも思ってない 人達もいますが…
*3:4.3BSD-TahoeでPower 6/32に移植←わかる 現在←これわかんねぇなもう
*4:ANSI X3.159-1989
*5:ISO/IEC 9899:1990
*6:それ以前の1988年にもPOSIX.1すなわち IEEE Std 1003.1-1988が成立してますな。
*7:同時にデバッガもadb(absolute debugger、Androidのアレとは無関係でSolarisとかではまだ現役)からgdbに変更されています。


[ホームへ] [ページトップへ]