私はいくつかのレガシー C コードに取り組んでいます。元のコードは 90 年代半ばに書かれ、その時代の Solaris と Sun の C コンパイラをターゲットにしていました。現在のバージョンは GCC 4 でコンパイルされ (ただし、多くの警告が表示されます)、動作しているように見えますが、整理しようとしています。 64 ビット プラットフォーム、およびビルド対象以外のコンパイラに適応させます。
この点に関する私の主な活動の 1 つは、すべての関数に完全なプロトタイプ (多くはありませんでした) があることを確認することでした。そのコンテキストで、関数よりも少ない引数で関数 (以前はプロトタイプ化されていなかった) を呼び出すコードを発見しました。定義は宣言します。関数の実装では、欠落している引数の値が使用されます。
例:
impl.c:
int foo(int one, int two) {
if (two) {
return one;
} else {
return one + 1;
}
}
client1.c:
extern foo();
int bar() {
/* only one argument(!): */
return foo(42);
}
client2.c:
extern int foo();
int (*foop)() = foo;
int baz() {
/* calls the same function as does bar(), but with two arguments: */
return (*foop)(17, 23);
}
質問: 欠落している引数が定義されている関数呼び出しの結果は? その場合、関数は指定されていない引数に対してどのような値を受け取りますか? それ以外の場合は、ca の Sun C コンパイラになります。1996 (VMS ではなく Solaris の場合) は、影響を受ける呼び出しに特定の引数値を追加することでエミュレートできる予測可能な実装固有の動作を示しましたか?