4

C はメソッドのオーバーロードをサポートしていないため、open2 つの異なるシグネチャを明示的に提供する のようなメソッドをどのようにして持つことができるでしょうか。

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

つまり、 を使用してさまざまなprintf数の引数をサポートしますが、それ自体vargsを使用するもの以外に明確な署名はありません。それ以外の場合は、可能な呼び出しごとに 1 つの署名が必要です。それでも、私が推測するように、C で書かれており、2 つの明示的な署名を提供しています。vargsprintfopen()

これらの機能の実装方法は実際にはわかりませんでした。誰かが関数がどのように機能するかの小さな例を示すことができますか:

void foo() { printf("bar\n"); }
void foo(int x) { printf("bar %d\n", x); }

Cで実装されますか?

4

5 に答える 5

1

この関数について学ぶために、貧弱なリファレンス ( http://linux.die.net ) を選びました。より良いものはOpen Group Base Specificationsです。そして、次の宣言を示していますopen()

int open(const char *path, int oflag, ... );

つまり、これは単なる可変引数です。

于 2013-04-13T17:47:01.567 に答える
1

2 つの異なる署名を明示的に提供する open のようなメソッドをどのようにして持つことができるでしょうか。

待って、待って、待って…いや。程遠い。ドキュメントを読んでみませんか?

open()は可変引数関数であり、その署名は

int open(const char *path, int oflag, ... );

ここには魔法はありません。

于 2013-04-13T17:47:40.490 に答える
0

質問で述べたように、プログラムで同じ名前の関数を複数回定義することはできません

マクロを使用すると、C コードで関数を複数回定義できますが、コンパイルされる関数は 1 つだけです。

#ifdef MACRO1
void foo() { printf("bar\n"); }
#else
void foo(int x) { printf("bar %d\n", x); }
#endif

そして主に

#ifdef MACRO1
    foo();
#else
    foo(5);
#endif
于 2013-04-13T17:42:39.323 に答える