C 関数に多くの引数を渡すにはどうすればよいですか? 私がこの機能を持っていると仮定します:
void f(int n, char* a, char* b, ...)
未定義の数の char* 引数が必要です。どうすればそうできますか?
必要なものは可変数引数関数と呼ばれるもので、9.9 から読むことができます。可変数の引数は、優れたエッセイのチュートリアルです。
私のコードを理解するには、次の 4 点の短い理論が役立ちます。
<stdarg.h>
ます。彼は va_list と呼ばれる新しい型と、この型のオブジェクトを操作するva_start, va_arg, and va_end
.va_start:
オプションの引数arg_ptr
のリストの先頭に設定するマクロですap
va_arg:
この保存されたスタック ポインターを使用し、提供された型の正しいバイト数を抽出します。va_end:
リセットするマクロです。ap
すべての引数が取得された後va_end
、ポインターを NULL にリセットします。この理論は十分ではありませんが、以下の例 (必要に応じて) は、基本的なワークフローと手順を理解するのに役立ちます: (各 4 つの手順のコメントを読んでください)
//Step1: Need necessary header file
#include <stdarg.h>
void f(int first, char* a, char* b, ...){
va_list ap; // vlist variable
int n; // number
char aa,
int i;
float f;
//print fix numbers of arguments
printf("\n %d, %s, %s\n", first, a, b);
//Step2: To initialize `ap` using right-most argument that is `b`
va_start(ap, b);
//Step3: Now access vlist `ap` elements using va_arg()
n = va_arg(ap, int); //first value in my list gives number of ele in list
while(n--){
aa = (char)va_arg(ap, int); // notice type, and typecast
i = va_arg(ap, int);
f = (float)va_arg(ap, double);
printf("\n %c %d %f \n", aa,i, f);
}
//Step4: Now work done, we should reset pointer to NULL
va_end(ap);
}
int main(){
char* a = "Aoues";
char* b = "Guesmi";
f(2, a, b, 3, 'a', 3, 6.7f, 'b', 5, 5.5f, 'A', 0, 0.1);
// ^ this is `n` like count in variable list
return 1;
}
誰が実行しますか:
~$ ./a.out
2, Aoues, Guesmi
a 3 6.700000
b 5 5.500000
A 0 0.100000
私のコードの簡単な説明は、将来のユーザーに役立ちます。
char* b
内f()
) は、初期化された実行可能リストにのみ使用されますap
。f()
読み取ります( main のコメントを読み取ります)。では、 が 3 回実行され、ループのたびにマクロを使用して 3 つの値を取得します。n
3
f()
while(n--)
va_arg()
ints
( mainで f() を呼び出していることに注意してください)。これは、可変引数リストの場合に自動型プロモートが行われるためです。(詳しくは上記のリンクからお読みください)double
char, int, float
彼女は MSDN からのもう 1 つの便利なリンクです: va_arg, va_end, va_start .
(これに関してさらにサポートが必要な場合はお知らせください)
varargs を使用します (これを自分で調べてください。呼び出し先が引数を読み取るために使用するものは にありますstdarg.h
)。
呼び出し先が実際に渡された引数の数を自動的に決定する方法はないことに注意してください。たとえば、それは である可能性がありn
、呼び出し元を信頼してn
正しく処理する必要があります。