2010-11-29 7 views
5

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(...); 
} 
+0

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

+0

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

Antwort

2

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; 
} 
3

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); 
} 
1

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

Verwandte Themen