2009-09-28 7 views
38

Rozumiem, że różnica między printf, fprintf, sprintf etc funkcji i vprintf, vfprintf, vsprintf etc funkcji ma do czynienia z tym, jak radzą sobie z argumentów funkcji. Ale jak konkretnie? Czy naprawdę istnieje jakikolwiek powód, aby korzystać z jednego na drugim? Czy powinienem zawsze używać printf, ponieważ jest to bardziej powszechne zjawisko w C, czy też istnieje uzasadniony powód, by wybrać vprintf?jaka jest różnica między rodzinami funkcji printf i vprintf, i kiedy należy używać jednej z drugiej?

Odpowiedz

59

printf() i przyjaciele są do normalnego użytku. vprintf() i przyjaciele są, gdy chcesz napisać własną funkcję podobną do printf(). Powiedzmy, że chcesz napisać funkcję do wydrukowania błędów:

int error(char *fmt, ...) 
{ 
    int result; 
    va_list args; 
    va_start(args, fmt); 
    // what here? 
    va_end(args); 
    return result; 
} 

Zauważysz, że nie można przejść args do printf(), ponieważ printf() zajmuje wiele argumentów, zamiast jednej va_list argument. W vprintf() funkcje, jednak zrobić wziąć va_list argumentu zamiast zmiennej liczbie argumentów, więc tutaj jest zakończona wersja:

int error(char *fmt, ...) 
{ 
    int result; 
    va_list args; 
    va_start(args, fmt); 
    fputs("Error: ", stderr); 
    result = vfprintf(stderr, fmt, args); 
    va_end(args); 
    return result; 
} 
+1

Oczywiście, wtedy chcesz ostrzec() 'funkcję', który działa jak 'error()', ale drukuje "Ostrzeżenie:" zamiast tego, więc tworzysz własną funkcję _own_ 'vprintf()' 'int verror (char * prefix, char * fmt, va_list args);' i masz 'error()' wywołaj to za pomocą "Error:" i "warn()" wywołaj je za pomocą "Warning:", ale to wszystko jest semantyką. –

+0

czas na poznanie funkcji variadycznych! Ta odpowiedź wyjaśniła sprawę, dziękuję. –

13

Bezpośrednio nie chcesz używać vprintf(), ale jest niesamowicie przydatny, gdy potrzebujesz np. wrap printf(). W tych przypadkach zdefiniujesz funkcję najwyższego poziomu ze zmiennymi argumentami (...). Następnie zbierzesz te dane do va_list, wykonasz przetwarzanie i ostatecznie zadzwonisz pod numer vprintf() na va_list, aby uzyskać wydruk.

Powiązane problemy