Comprendo che la differenza tra le funzioni printf
, fprintf
, sprintf
e le funzioni vprintf
, vfprintf
, vsprintf
ecc. Ha a che fare con il modo in cui trattano gli argomenti della funzione. Ma in che modo specificamente? C'è davvero qualche ragione per usare l'uno sull'altro? Dovrei semplicemente usare sempre printf
in quanto è una cosa più comune da vedere in C, oppure esiste un motivo legittimo per scegliere vprintf
?Qual è la differenza tra le famiglie di funzioni printf e vprintf e quando dovrei usare l'una sull'altra?
risposta
printf()
e gli amici sono per uso normale. vprintf()
e gli amici sono per quando si desidera scrivere la propria funzione printf()
-like. Dire che si desidera scrivere una funzione per stampare gli errori:
int error(char *fmt, ...)
{
int result;
va_list args;
va_start(args, fmt);
// what here?
va_end(args);
return result;
}
Si noterà che non si può passare a args
printf()
, dal momento che printf()
prende molti argomenti, piuttosto che uno va_list
argomento. Le vprintf()
funzioni, tuttavia, fanno prendere un argomento va_list
invece di un numero variabile di argomenti, ecco la versione completa:
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;
}
Non si desidera utilizzare direttamente vprintf()
, ma è incredibilmente utile quando è necessario ad es. avvolgere printf()
. In questi casi, definirai la funzione di primo livello con argomenti variabili (...). Quindi li raccoglierai in un va_list
, eseguirai l'elaborazione e infine chiami il numero vprintf()
sullo va_list
per fare in modo che la stampa si verifichi.
- 1. Qual è la differenza tra printf ("% i") e printf ("% d")
- 2. Qual è la differenza tra le funzioni VarIsEmpty e VarIsEmptyParam
- 3. Qual è la differenza tra JApplet e Applet e quale dovrei usare?
- 4. dplyr: qual è la differenza tra funzioni group_by e group_by_?
- 5. Qual è la differenza tra funzioni e chiusure?
- 6. Qual è la differenza tra printf ("% s"), printf ("% ls"), wprintf ("% s") e wprintf ("% ls")?
- 7. Qual è la differenza tra queste funzioni?
- 8. Qual è la differenza tra queste funzioni
- 9. Qual è la differenza tra l'utilizzo e l'inclusione in C++?
- 10. Differenza tra le funzioni read.table e read.delim
- 11. Quando dovrei usare setUpClass e quando __init__?
- 12. In Angular, qual è la differenza concettuale tra l'errore e le funzioni catch per le promesse?
- 13. Qual è la differenza tra dict() e {}?
- 14. Differenza tra getcwd() e dirname (__ FILE__)? Quale dovrei usare?
- 15. Qual è la differenza tra ::: e ++ per le liste?
- 16. Qual è la differenza tra read e pread in unix?
- 17. Qual è la differenza tra URLWithString e fileURLWithPath di NSURL?
- 18. In Linq, qual è la differenza tra .FirstOrDefault e .SingleOrDefault
- 19. Qual è la differenza tra .ToString() e + ""
- 20. Qual è la differenza tra ConfigurationManager.GetSection e Configuration.GetSection?
- 21. Qual è la differenza tra ("") e (null)
- 22. Qual è la differenza tra QImage e QPixmap?
- 23. Qual è la differenza tra gemme e plug-in?
- 24. Qual è la differenza tra Verilog! e ~?
- 25. Qual è la differenza tra escapeshellarg e escapeshellcmd?
- 26. Qual è la differenza tra // e /// in Visual Studio?
- 27. Qual è la differenza tra gli identificatori di conversione% i e% d nelle funzioni di I/O formattate (* printf/* scanf)
- 28. Differenza tra NSLog e printf per ObjectiveC
- 29. Qual è la differenza tra l'operatore "=" e "==" in Bash?
- 30. Qual è la differenza tra require e include con php?
Naturalmente, poi si desidera una funzione di 'mettere in guardia()', simile 'error()' ma stampa "Warning:" invece, quindi crei la tua funzione _own_ 'vprintf()': int verror (char * prefisso, char * fmt, va_list args); 'e have' error() ' chiamalo con "Error:" e "warn()" chiamalo con "Warning:" ma è tutto semantico. –
tempo per conoscere le funzioni variadiche! Questa risposta ha chiarito le cose, grazie. –