2013-06-09 12 views
6

Avviso: un oggetto non POD di tipo "std :: string" passato come argomento variabile per funzionare "std :: printf (const char *, ...)".Avviso non POD C++ per passare una stringa?

Non c'è niente in linea che spiega cosa significa questo avvertimento.

Come dovrei ottenere il printf per scrivere questo (assumendo il nome del file = test.txt):

Nome file: (a destra giustificare il nome del file) test.txt

Grazie in anticipo.

risposta

9

La spiegazione è molto semplice: solo POD (Plain Old strutture dati) può essere passato come argomento a una funzione variadic (non una funzione variadic modello però, solo una semplice funzione variadic con i puntini di sospensione).

std::string non è un POD, ma si può fare:

printf("%s% 38s\n", "Filename:", filename.c_str()); 
//          ^^^^^^^^ 

Le c_str() member function ritorna un const char* alla stringa C incapsulato.

+0

Grazie a entrambe le risposte. – user2369405

+0

@ user2369405: Sono contento che sia stato d'aiuto –

3

printf, se utilizzato con l'identificatore di formato %s, richiede un puntatore al carattere. È possibile ottenere che da un std::string attraverso il metodo c_str():

printf("%s% 38s\n", "Filename:", filename.c_str()); 

Per inciso, si noti che se non si intende modificare o copiare la stringa di input, si dovrebbe passare da const di riferimento:

void displayinfo(const string& filename) { .... } 
0

Dubito seriamente che la rete sia silenziosa. Forse hai guardato nei posti sbagliati o hai usato keyworrs nad.

La regola di base è semplice, passando non POD come ... l'argomento è comportamento indefinito. Non farlo a meno che la tua implementazione non abbia definito un comportamento e corrisponda al tuo compito.

E in particolare per la famiglia printf, la stringa di formato richiede tipi specifici da passare, l'hai interrotta anche se il POD passava.

Problemi correlati