可変数の引数を渡す

省略記号を渡すには、それらを va_list に変換し、その va_list を 2 番目の関数で使用する必要があります。特に;

void format_string(char *fmt,va_list argptr, char *formatted_string);


void debug_print(int dbg_lvl, char *fmt, ...) 
{    
 char formatted_string[MAX_FMT_SIZE];

 va_list argptr;
 va_start(argptr,fmt);
 format_string(fmt, argptr, formatted_string);
 va_end(argptr);
 fprintf(stdout, "%s",formatted_string);
}

いたずらで移植性のないトリックを使用したい場合を除き、渡される引数の数を知らずに (たとえば) printf を呼び出す方法はありません。

一般的に使用される解決策は、常に可変引数関数の代替形式を提供することです。そのため、printf vprintf あります va_list かかります ... の代わりに . ... バージョンは va_list の単なるラッパーです バージョン。


可変長関数は危険になる可能性があります .より安全な方法は次のとおりです:

   void func(type* values) {
        while(*values) {
            x = *values++;
            /* do whatever with x */
        }
    }

func((type[]){val1,val2,val3,val4,0});