入力中にこの質問に遭遇しましたman 2 open
。open には引数が 2 つあるものと 3 つあるものの 2 種類があると書かれています。前回チェックしたとき、C では関数をオーバーロードできませんでした。どうやってこれを行ったのですか? 彼らは C++ で書きましたか?
int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);
入力中にこの質問に遭遇しましたman 2 open
。open には引数が 2 つあるものと 3 つあるものの 2 種類があると書かれています。前回チェックしたとき、C では関数をオーバーロードできませんでした。どうやってこれを行ったのですか? 彼らは C++ で書きましたか?
int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);
いいえ、可変関数を使用しただけです。
int open(const char * pathname, int flags, ...);
これにより、最後の引数がmode
オプションになります。プロトタイプは、実際のインターフェイスではなく、関数の使用方法のみを示しています。
もちろん、実際のオーバーロードとは異なり、コンパイラはmode
引数の型をチェックできないため、ユーザーは 2 つまたは 3 つの引数のみが渡されるように特に注意する必要があり、3 番目の引数はmode_t
.
ところで、man 2 open
BSD (OS X を含む) を確認すると、上記のように正しいプロトタイプが表示されます。
価値があるのは、マニュアルページが正しくないことです。それが示すプロトタイプ:
int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);
は正しいプロトタイプと同等ではありません:
int open(const char * pathname, int flags, ...);
それが提供する誤ったものを使用すると (たとえば、正しいヘッダーを含めるのではなく、自分で関数のプロトタイプを作成した場合)、プログラムの動作が未定義になります。(そして、これは単なる理論的なものではありません。おそらく、x86_64 やレジスタ渡し ABI を備えたその他のプラットフォームでは実行に失敗するでしょう。)
manページが表現しようとしていた(そして非常に貧弱な仕事をしていた)ことは、open
の引数リストの可変部分は空または単一のmode_t
型引数のいずれかであり、オプションの引数の有無は値に依存するということですのflags
。