Domanda

Per Sono venuto su questa riga di codice:

fprintf(stdout, "message", fflush(stdout));

Si noti che il messaggio non contiene alcun -tag%.

E 'questo sicuro in Visual C ++? fflush () restituisce 0 in caso di successo e EOF in caso di fallimento. Quale sarà fprintf () che fare con questo parametro in più?

ho pensato che questo era uno strano trucco per aggiungere una chiamata fflush () senza bisogno di una linea supplementare. Ma scritto in questo modo, la chiamata fflush () verrà eseguito prima della chiamata fprintf () in modo da non lavare il messaggio in fase di stampa in questo momento, ma quelli in attesa di essere lavato, se del caso ... ho ragione?

È stato utile?

Soluzione

E 'sicuro. Ecco cosa C (C99 atleast, paragrafo 7.19.6.1) dice su di esso

Se il formato è esaurita, mentre argomenti rimangono, gli argomenti in eccesso sono valutate, ma sono comunque ignorato.

Se l'obiettivo era quello di evitare una linea, io preferirei fare

fflush(stdout); fprintf(stdout, "message");

se non altro per evitare che la persona dopo aver letto che il codice di cacciare giù con una mazza.

Altri suggerimenti

fprintf non conosce il numero esatto dei parametri, si cerca solo di caricare un argomento per '%'. Se si forniscono meno argomenti che '%', si traduce in un comportamento indefinito, se si forniscono più argomenti, vengono ignorati.

Ad seconda domanda, sì, questo sarebbe solo i messaggi a filo nella coda, il nuovo messaggio non sarà arrossata.

Credo fprintf sta usando varargs a parametri di processo, in modo che qualsiasi parametri extra dovrebbe essere ignorato in modo sicuro (non che si tratta di una buona pratica o niente). E hai ragione che fflush sarà chiamato prima fprintf, quindi questo è una specie di hack inutile.

Con segnali di avvertimento abbastanza abilitato (come -Wall per gcc) si otterrà un messaggio di avviso

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top