任意の数の引数を取り、引数の値のみを出力できる C 関数を作成したいと考えていますint
。va_list
とを見ましたva_arg
がstdarg.h
、引数の数を取得するメカニズムが見つかりませんでした。最初の引数を引数の数として取ることができません。
質問する
107 次
3 に答える
2
標準 C には、可変引数関数の引数の数を取得するための移植可能な方法はありません。
これを解決する一般的な方法は、右端のパラメーターparmN
を使用して整数の数を明示的に指定することです。たとえば、関数プロトタイプは次のようになります。
int foo(int number, ...);
しかし、あなたの質問によると、これはあなたにとって選択肢ではありません。
于 2013-10-16T08:44:12.633 に答える
0
NARGS マクロの使用 (この場合、8 つの引数に制限されています):
#include <stdio.h>
#include <stdarg.h>
#define NARGS_SEQ(_1,_2,_3,_4,_5,_6,_7,_8,N,...) N
#define NARGS(...) NARGS_SEQ(__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1)
#define fn(...) fn(NARGS(__VA_ARGS__), __VA_ARGS__)
static void (fn)(int n, ...)
{
va_list args;
int i;
va_start(args, n);
for (i = 0; i < n; i++) {
printf("%d\n", va_arg(args, int));
}
va_end(args);
}
int main(void)
{
fn(6, 7, 8);
return 0;
}
または、-1 までループできます。
#include <stdio.h>
#include <stdarg.h>
#define fn(...) fn(0, __VA_ARGS__, -1)
static void (fn)(int n, ...)
{
va_list args;
int i;
va_start(args, n);
while (1) {
i = va_arg(args, int);
if (i == -1) break;
printf("%d\n", i);
}
va_end(args);
}
int main(void)
{
fn(6, 7, 8);
return 0;
}
于 2013-10-16T08:43:12.480 に答える