[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
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.