6

重複の可能性:
C/C++: 可変数の引数を渡す

関数宣言の仕方によると

return-type function-name(parameter-list, ...) {body ...}

次のコードは一種のオーバーロードですか?

(A_FILE.h 内)

typedef VOID *FUNCTION(UINTN Number, ...);

Number1 つまたは複数のパラメーターを関数に渡すことができるようですがFUNCTION、パラメーターの数は関数の実装によって異なりますか?

4

3 に答える 3

3

関数宣言内の省略形は、それ以外の場合は多数の引数を受け入れることを意味します。実行時に不明な変数パラメーターは、標準ヘッダーファイルを使用することによりstdarg.h、そのヘッダーファイル'stdarg.h'内のそれぞれの関数が何を決定できるかを決定します。各変数パラメーターは、関数に渡される引数を構成するものです。

このコード例を考えてみましょう。

#define PANIC_BUF_LEN 256
void panic(const char *fmt, ...){
    char buf[PANIC_BUF_LEN];
    va_list argptr;
    va_start(argptr, fmt);
    vsprintf(buf, fmt, argptr);
    va_end(argptr);
    fprintf(stderr, buf);
    exit(errcode);
}

典型的な呼び出しは、次の例の1つです。

panic("Error: %s failed! Due to unknown error, message is '%s'\n", "my_function", "Disk not ready");

次のようにコンソールに出力を生成します。

Error: my_function failed! Due to unknown error, message is 'Disk not ready'

関数がどのように使用されているかに注意してください。もちろんva_start(...)提供された「不明な」パラメーター内の空白の入力は、実行時に不明な変数パラメーター指すように初期化されます。va_end(...)vsprintf(...) va_list

編集:強調するために、呼び出しは、C文字列形式の形式の文字列パラメーターが上記ので表される最大サイズよりも小さいことを前提としています。使用される標準のCフォーマット文字列の数。たとえば、文字列フォーマットで指定でき、パラメータと一致することが期待できます。PANIC_BUF_LEN%dint

于 2012-12-27T03:55:23.527 に答える
2

C++ の意味でのオーバーロードではありませんが、同様の効果に使用できます。は...、関数が名前付き引数の後に任意の数の追加引数を取り (少なくとも 1 つの名前付き引数が必要)、追加引数が任意の型(種類) を持つことができることを示します。1 そのような関数の実装は、実行時に追加の引数の数と型を推測できなければなりません。たとえば、printf任意の組み込み型を一度に出力できますが%、実際の引数に対応する書式文字列でコードを指定する必要があります。

C++ スタイルのオーバーロードをシミュレートするために使用される可変引数の注目すべき例の 1 つは、openシステム コールです。これには、C++ 用語で 2 つのオーバーロードがあります。

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

マンページはそのように書かれていますが、調べてみる<fcntl.h>と、実際の宣言が

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

O_CREATビットがフラグに設定されている場合、実装は 3 番目の引数のみを調べます。そのビットを設定する場合は、3 番目の引数を指定する必要があることが文書化されています。C ではいつものように、間違ったやり方をすると、コンパイラーは実行時にそれが爆発するのを元気よく見守っています。

1 「デフォルト引数プロモーション」と呼ばれる痕跡言語機能のおかげで、可変数の引数を取る関数に追加の引数として渡されると、一部の数値型が別のより大きな数値型に変換されます。そのような関数の本体を書いている場合にのみ、これについて心配する必要があります。

于 2012-12-27T04:20:45.820 に答える
0

いいえ。「...」は可変引数を意味します。

オーバーロードとは、コンパイラーが名前を混ぜ合わせて、異なる引数セットを持つ複数の関数を生成することです。Cでは、関数名が混ざっていませんが、関数は1つ以上の引数を受け入れることができます。

于 2012-12-27T03:59:16.743 に答える