16

入力中にこの質問に遭遇しました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);
4

3 に答える 3

19

いいえ、可変関数を使用しただけです。

int open(const char * pathname, int flags, ...);

これにより、最後の引数がmodeオプションになります。プロトタイプは、実際のインターフェイスではなく、関数の使用方法のみを示しています。

もちろん、実際のオーバーロードとは異なり、コンパイラはmode引数の型をチェックできないため、ユーザーは 2 つまたは 3 つの引数のみが渡されるように特に注意する必要があり、3 番目の引数はmode_t.


ところで、man 2 openBSD (OS X を含む) を確認すると、上記のように正しいプロトタイプが表示されます。

于 2010-10-17T15:38:12.420 に答える
8

価値があるのは、マニュアルページが正しくないことです。それが示すプロトタイプ:

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

于 2010-10-17T15:43:30.347 に答える
7

いいえ、可変引数を使用して C で記述しました。

例があるstdarg.hを確認してください。

可変個引数関数は、省略記号から好きなだけ引数を読み取ることができます。関数が「必要としない」余分な引数は、実際には破棄されます。

于 2010-10-17T15:38:09.310 に答える