[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.24 プロトタイプ宣言と古い形式の定義

GNU C は ANSI C を拡張して、関数のプロトタイプがその後に現れる 古い形式の、非プロトタイプ的定義を上書きすることを許している。 以下の例を考えてみよう。

 
/* Use prototypes unless the compiler is old-fashioned.  */
#ifdef __STDC__
#define P(x) x
#else
#define P(x) ()
#endif

/* Prototype function declaration.  */
int isroot P((uid_t));

/* Old-style function definition.  */
int
isroot (x)   /* ??? lossage here ??? */
     uid_t x;
{
  return x == 0;
}

uid_t 型がたまたま short になる場合を考えてみよう。 ANSI C ではこの例は許されない。なぜなら、古い形式の非プロトタイプ的 な定義においては、ワードより小さいサイズの引数は格上げされるからである。 このため、この例では、関数の定義での引数は実際には int になるので、 引数の型が short であるプロトタイプと一致しないのである。

ANSI C のこの制限により、旧来の C コンパイラでも動作するコードを 書くのが難しくなっている。プログラマは、uid_t 型が、 short なのか、int なのか、あるいは long なのか 知らないからである。このため、GNU C ではこういう場合、プロトタイプで 後続の古い形式の定義を上書きするようになっている。もっと正確に言うと、 GNU C では、関数のプロトタイプの引数型が、後に現れる古い形式の 定義で指定される型を、前者の型が格上げ前の後者の型と同じである場合には、 上書きするのである。このため、GNU C では上の例は、以下のように書いたのと 同じである。

 
int isroot (uid_t);

int
isroot (uid_t x)
{
  return x == 0;
}

GNU C++ では古い形式の関数定義をサポートしていないので、 この拡張は関係ない。


This document was generated using texi2html 1.78.