関数宣言内の省略形は、それ以外の場合は多数の引数を受け入れることを意味します。実行時に不明な変数パラメーターは、標準ヘッダーファイルを使用することにより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
%d
int