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?
jaka jest różnica między rodzinami funkcji printf i vprintf, i kiedy należy używać jednej z drugiej?
Odpowiedz
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;
}
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.
- 1. Kiedy należy używać setUpClass i kiedy __init__?
- 2. Jaka jest różnica między funkcją i funkcji
- 3. W Objective-C, kiedy należy używać metod klas i kiedy należy używać metod instancji?
- 4. Kiedy należy używać JCR i kiedy należy używać JPA/RDBMS?
- 5. Jaka jest różnica między tf.Session() i tf.InteractiveSession()?
- 6. Jaka jest różnica między? : i ||
- 7. Jaka jest różnica między MAP_SHARED i MAP_PRIVATE w funkcji mmap?
- 8. Linq: Jaka jest różnica między Select i Where
- 9. Jaka jest różnica między `after_create` i` after_save` oraz kiedy użyć?
- 10. Jaka jest różnica między $ i $$?
- 11. Jaka jest różnica między $ http i $ q?
- 12. Jaka jest różnica między CreateWnd i CreateWindowHandle?
- 13. Jaka jest różnica między rurami i gniazdkami?
- 14. Jaka jest różnica między zwrotnego i obiecują
- 15. Jaka jest różnica między split() i explode()?
- 16. Jaka jest różnica między navigationController.navigationBarUkryty i navigationController.navigationBar.hidden?
- 17. Jaka jest różnica między `alias` i` typedef`?
- 18. Jaka jest różnica między sys i os.sys
- 19. Jaka jest różnica między addChildViewController i presentModelViewController
- 20. Jaka jest różnica między withTransaction i NewTransaction?
- 21. Jaka jest różnica między NaN i None?
- 22. Jaka jest różnica między RSpec i Cucumber?
- 23. Jaka jest różnica między NetFx45WebLink i NetFx45RedistLink
- 24. Jaka jest różnica między window.location.host i window.location.hostname
- 25. Jaka jest różnica między Array.GetLength() i Array.Length?
- 26. Jaka jest różnica między ATL i WTL?
- 27. Jaka jest różnica między runghc i runhaskell?
- 28. Jaka jest różnica między http_build_str() i http_build_query()?
- 29. Jaka jest różnica między Eclipse i Myeclipse
- 30. Jaka jest różnica między Json i Jsonp?
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ą. –
czas na poznanie funkcji variadycznych! Ta odpowiedź wyjaśniła sprawę, dziękuję. –