Hier ist, was ich versucht ... aber nicht:Wie würde ich den `...` C-Operator verwenden, um eine Funktion zum Ausdrucken aller Argumente zu erhalten?
void testfunc(...){
printf(...);
}
Hier ist, was ich versucht ... aber nicht:Wie würde ich den `...` C-Operator verwenden, um eine Funktion zum Ausdrucken aller Argumente zu erhalten?
void testfunc(...){
printf(...);
}
Sie va_start()
verwenden müssen, va_end()
, va_arg()
und (nicht immer) va_list
und Sie müssen mindestens eine Konstante definiert Argument haben! Beispiel:
#include <stdio.h>
#include <stdarg.h>
void PrintFloats (int amount, ...)
{
int i;
double val;
printf ("Floats passed: ");
va_list vl;
va_start(vl,amount);
for (i=0;i<amount;i++)
{
val=va_arg(vl,double);
printf ("\t%.2f",val);
}
va_end(vl);
printf ("\n");
}
int main()
{
PrintFloats (3,3.14159,2.71828,1.41421);
return 0;
}
Dadurch wird eine Funktion erstellt, die printf
entspricht. Beachten Sie, dass Sie Argumente nicht blind ausdrucken können, da Sie im Voraus wissen müssen, welcher Typ jedes Argument ist. Das Argument format
von printf informiert darüber, welche Argumente zu erwarten sind und welche Typen sie sein werden.
#include <stdargs.h>
void testfunc(const char *format, ...)
{
va_list ap;
va_start(ap, format);
vprintf(format, ap);
va_end(ap);
}
können Sie verwenden, um die va_start()
und va_end()
Makros, aber Sie werden mindestens ein Argument haben müssen:
void testfunc(int n, ...)
{
va_list vl;
va_start(vl, n); // initialize the va_list
// something useful
va_end(vl); // deinitializes vl
}
Sie können die Argumente der Reihe nach Zugang mit va_arg(vl, type)
(z int x = va_arg(vl, int)
). Auch va_copy
ist gelegentlich nützlich, wenn Sie den aktuellen Zustand des va_list
möglichen Duplikats von [Übergabe von Variablenargumenten an eine andere Funktion, die eine Liste mit variablen Argumenten akzeptiert] kopieren möchten (http://stackoverflow.com/questions/3530771/ passing-variable-arguments-to-andere-function-that-accommends-a-variable-argument-l) – Justin
Ich bin nicht sicher, ob das vorgeschlagene Duplikat wirklich ein exaktes Duplikat ist (es ist nicht wirklich klar, was du willst um hier zu erreichen), auf jeden Fall ist es sehr ähnlich und sollte Ihnen helfen. – Justin