[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freewnn:00308] jutil



小野寛生です

dtoa とかに自分の欲しい feature を入れてみたいと思って、source を眺め
始めました。自分で書こうと思って C を眺めるのは久しぶりで、もともと大
したことがないのに、すっかり忘れてしまっていることを思い知らされていま
す。

で、いくつか気になる点があります。
間抜けな質問かも知れませんが、教えて頂けないでしょうか。

1. prototype宣言
prototype 宣言は Ansi C のを使えるようにしようよという話があったと思
います。以前出ていた話では、
 * FreeBSD の source にあるように __P macro を使う。
 * ansi2knr
というのがあったと思うのですが、どちらを取ればよいのでしょう?

前者なら、とりあえず、FreeBSD 3.4-stable の /usr/include/term.h から引っ
張ってきた、

#ifndef __P
#if defined(_USE_PROTOTYPES) && (defined(__STDC__) || defined(__cplusplus))
#define __P(protos)     protos          /* full-blown ANSI C */
#else
#define __P(protos)     ()              /* traditional C preprocessor */
#endif
#endif

というのを commonhd.h に突っ込めば良いかなと思うのですが、こうした場合、
prototype は、
  int function __P ((int));
でよいかと思うのですが、実際の関数の定義の部分はどう書くべきなのでしょう?

int
funciton __P((int var))
  int var; /* ? */
{
}

なのか、? の部分は、ANSI C では消えるようにすべきなのか、ANSI C という
かとりあえず gcc だけ考えて function() としてしまってよいのか?

2. extern?
 Xsi/Wnn/jutil/ 以下の .c ファイルには、prototype 宣言が
   extern void func();
 とか
   extern int func();
 となっているのですが、extern って何故ついているのでしょう???

% ほかにも、ujisf.c の関数は他で使われているので、いちいちプロトタイプ
% 宣言せずに、ujisf.h を作って include した方がよいかもしれない、とか。

3. どうしてこういう定義が?
たとえば、Xsi/Wnn/jutil/{atod,dtoa,atof}.c などでは
 exit1() とか sort() という関数を使っているのですが、
そいつは Xsi/Wnn/jutil/ujisf.c で

void
exit1()
{
    exit(1);
}

とか、

void
sort()
{
    qsort((char *)jeary,jt.maxserial, sizeof(struct je *),sort_func_je);
}

とか定義されています。

Xsi/Wnn/jutil/ にあるファイルをざっと grep して見た限りでは、別にどこ
かに代入されたり、何かの引数になってから実行されている風もありません。
% sort() の方はもう一度きちんと確認する必要がありそうですが…。
というわけで、exit1() は

#include <stdlib.h>
 exit(1);

で済むと思うのですが、さて何で今のようになっているのでしょう?

4. man
あんまり、関係ないのですが、現在はマニュアルが Xsi/Wnn/man 以下にあり
ますが、それはそっちにまとめた方がメンテナンスはしやすいでしょうか?
それとも、Xsi/Wnn/jtuil/dtoa.1 と source と同じ場所にあった方がよいで
しょうか。
% どちらの方式も世の中にあるようなのですが。
----
Hiroo ONO