2013-06-09 10 views
6
void displayinfo(string &filename) 
{ 
printf("%s% 38s\n", "Filename:", filename); 
... 

Ostrzeżenie: Obiekt inny niż POD typu "std :: string" przekazywany jako argument zmiennej do funkcji "std :: printf (const char *, ...)".C++ nie POD ostrzega przed przekazaniem ciągu znaków?

Nie ma nic online wyjaśniającego, co oznacza to ostrzeżenie.

Jak bym uzyskać printf napisać to (zakładając filename = Test.txt):

Nazwa pliku: (prawy uzasadnić pliku) TEST.TXT

góry dziękuję.

Odpowiedz

9

Wyjaśnienie jest dość proste: tylko POD (Struktury Zwykłej Stare Dane) mogą być przekazywane jako argumenty do funkcji wariadycznej (nie jest to jednak funkcja z Wariadami , tylko prosta funkcja wariancji wykorzystująca elipsy).

std::string nie jest POD, ale można to zrobić:

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

W c_str() member function Zwraca const char* do odizolowanej C łańcucha.

+0

Dzięki obu odpowiedzi. – user2369405

+0

@ user2369405: Cieszę się, że pomogło –

3

printf, gdy jest używany ze specyfikatorem formatu %s, wymaga wskaźnika do zwęglenia. można dostać z std::string metodą c_str():

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

Na marginesie należy zauważyć, że jeśli nie zamierza zmodyfikować lub skopiować ciąg wejściowy, należy przejść przez const odniesienia:

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

Poważnie wątpię, że sieć będzie cicha. Być może patrzyłeś na niewłaściwe miejsca lub używane nad keyworrs.

Podstawowa zasada jest prosta, przekazywanie nie-POD jako ... argument jest niezdefiniowanym zachowaniem. Nie rób tego, chyba że twoja implementacja zdefiniowała pewne zachowanie i pasuje do twojego zadania.

I w szczególności dla rodziny printf, ciąg formatów wymaga przekazania określonych typów, zepsułeś to, nawet jeśli przeszedł POD.

Powiązane problemy