http://decomo.info/wiki/" /> クソゲ〜製作所 - 1.[kernel/main.c]_PROTOTYPEマクロに唸る

クソゲ~製作所

新システムに移行中:http://decomo.info/wiki/

« 0.MINIXのソースを読む | メイン | GLEW.framework »
スポンサーリンク

2007年07月11日

 

1.[kernel/main.c]_PROTOTYPEマクロに唸る

 
http://decomo.info/wiki/blog/2007/2007-07-11に移行しました。

MINIXのご本尊のmainだと思われる、kernel/main.cから読み進めて行こう。ファイルの冒頭にも「This file contains the main program of MINIX as well as its shutdown code.」と書いてある。

24行目から始まるプロトタイプ宣言。初っぱなからマクロの登場だ。

FORWARD _PROTOTYPE( void announce, (void));

FORWARDはinclude/minix/const.hで#define FORWARD staticと定義されている。これ以外の独自修飾子も、同様にconst.hで宣言されている。

include/minix/const.h:9-12
#define EXTERN        extern	/* used in *.h files */
#define PRIVATE       static	/* PRIVATE x limits the scope of x */
#define PUBLIC					/* PUBLIC is the opposite of PRIVATE */
#define FORWARD       static	/* some compilers require this to be 'static'*/

FORWARDは、関数のスコープをファイルスコープに押さえ込む役割のようだ。

続いて_PROTOTYPEマクロ。

名前からもわかるように、関数プロトタイプ宣言に関するマクロである。これの役割はK&R CとANSI Cのプロトタイプ宣言の違いを吸収するものっぽい。本体はinclude/ansi.hに記述されている。

#ifdef _ANSI

/* Keep everything for ANSI prototypes. */
#define _PROTOTYPE(function, params) function params
#define _ARGS(params) params
(略)

#else

/* Throw away the parameters for K&R prototypes. */
#define _PROTOTYPE(function, params) function()
#define _ARGS(params) ()
(略)

#endif /* _ANSI */

この定義と、先のプロトタイプ宣言を見比べると、K&RとANSIそれぞれの場合で以下のように展開されることがわかる。

ANSIの場合 static void announce (void);
K&R の場合 static void announce();

ANSIの場合は普通のプロトタイプ宣言だが、K&Rにはプロトタイプ宣言なるものは存在しないので、この文は関数の使用宣言をしているらしい(K&Rの資料がないので詳細は不明)。

では実際の関数定義部はどうなっているかというと……announce関数は引数を持たないので、その次のshutdown関数を見てみる。

PRIVATE void shutdown(tp)
timer_t *tp;
{
	...

こっちは完全にK&R準拠の書き方だ。後方互換の為に、ANSI Cでもこの書き方も許されている(無論、推奨はされていないが)ので、プロトタイプ宣言部分だけを切り替えてやれば、K&RなコンパイラでもANSIなコンパイラでもコンパイルできるって仕組みか。すげー!

Decomo | 23:17

トラックバック

 

■このエントリーのトラックバックアドレス:
http://www.decomo.info/cgi-php/mt/mt-KusoGA-gattsuIshimatsu.cgi/219


■このエントリーのアドレス:
http://decomo.info/mt/archives/2007/200707112317.shtml

 

コメント

 
 

コメントをどうぞ...

 






保存しますか?