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

Re: [patch] inputmethod/sj3-server-bin



あと、下記のパッチは良くないです。

>>>>> On Tue, 10 Oct 2006 22:34:51 +0900,
      藤原 誠/ Makoto Fujiwara <makoto@ki.nu> said:

> +--- sj3dic/sjrc.c~	1997-01-23 20:26:31.000000000 +0900
> ++++ sj3dic/sjrc.c	2006-09-22 09:30:21.000000000 +0900
> +@@ -70,7 +70,7 @@
> + 	"server",	set_server,
> + 	NULL,		NULL
> + };
> +-
> ++extern char * getenv();
> + #define TOLOWER(c) (isupper(c) ? tolower(c) : (c))	
> + 
> + sjset_code()

getenv() のような標準関数の関数プロトタイプを、自分自身で宣言すること
によるメリットはありません。特に、他のシステムヘッダ経由で、間接的に
システム附属ヘッダ中の getenv() のプロトタイプ宣言が見えてしまった場合、
自分で宣言したプロトタイプと、システム附属ヘッダ中のプロトタイプの
違いでコンパイルエラーを引き起こしてしまう可能性があります。
(明示的に #include していないヘッダ中の関数の宣言が見えてしまうのは、
 本来はよろしくないんですが、実際には良くあります。pkgsrc の場合、
 NetBSD 以外もサポートしている関係上、この種の危険が特に増えます。)

従って、このような場合、「man 3 getenv」(場合によっては「man 2 システ
ムコール名」)で必要なヘッダを調べて、そのヘッダの #include を追加する
のがより良い対処でしょう (少なくとも、そのヘッダファイルが標準で定めら
れている場合は…)。
この場合は man を見ると #include <stdlib.h> とあり、<stdlib.h> は
C89 標準でも定められている標準ヘッダですから (man の STANDARDS セクショ
ンにもそう載っています)、
extern char * getenv();
のような宣言を追加するのではなく、
#include <stdlib.h>
をファイルの先頭に追加するのが正解でしょう。
-- 
soda