どのように私は、リスト内の項目の数を計算するのですか?
できません。それは提供されなければなりません。
どのようにループVAR-引数リストを通って、そのパラメータとしてのvoid *アイテムを取る別の関数にそれぞれのボイドにアイテムを渡すのですか?*
Variadic Functionsに記載されているように、
#include <stdarg.h>
void AddValues(int count, ...) {
va_list args;
va_start(args, count);
for(int i=count; i--;)
processItem(va_arg(args, void*));
va_end(args);
}
使用例:
void* p1 = ...;
void* p2 = ...;
void* p3 = ...;
void* p4 = ...;
AddValues(4, p1, p2, p3, p4);
これは処理内容によって異なりますが、可変パラメータの代わりに配列を使用しているはずです。
void AddValues(int count, const void** args) {
for(int i=count; i--;)
processItem(*(args++));
}
使用例:
#define C_ARRAY_LENGTH(a) (sizeof(a)/sizeof((a)[0]))
void* ptrs[4];
ptrs[0] = ...;
ptrs[1] = ...;
ptrs[2] = ...;
ptrs[3] = ...;
AddValues(C_ARRAY_LEN(ptrs), ptrs);
または(ポインタがNULLできない場合):
void AddValues(const void** args) {
while (*args != NULL)
processItem(*(args++));
}
使用例:
void* ptrs[5];
ptrs[0] = ...;
ptrs[1] = ...;
ptrs[2] = ...;
ptrs[3] = ...;
ptrs[4] = NULL;
AddValues(ptrs);
ます。http:// EN .cppreference.com/w/c/variadic – Rafael
あなたはそのように長さを計算することはできません。 'sizeof(args)/ sizeof(* args)' = 'sizeof(void *)/ sizeof(void)'しかし、voidはサイズがありません。 varargsリストを取る関数は、他のいくつかのソースからサイズを決定できる必要があります: - 別のパラメータ(printfは書式文字列中の%の数を使用します)または特殊な値(void *ポインタはすべて、 1つはNULLです)したがって、最初のパラメータはサイズでなければならないか、最後のvoid *は特別なセンチネル値を持つ必要があります。 –
@gbenroscience 'void *'パラメータはvar-argsの '...'と全く関係ありません。あなたは 'void *'を尊重することはできません。もしコンパイラが関わっている限り、それはちょうど 'void'へのポインタなので、何かに何かが指されているかをあなたに伝えません。 –