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

警告: "std :: printf(const char *、...)"関数に可変引数として渡される "std :: string"型の非PODオブジェクトです。文字列を渡すためのC++非POD警告?

この警告の意味を説明するオンラインはありません。

は、どのように私はprintfのは、この(と仮定すると、ファイル名= test.txtという)を書くことになるだろう:

ファイル名:(右のファイル名を正当化)、事前に

感謝をtest.txtという。

答えて

9

説明は非常に簡単です:だけのPOD(プレーン古いデータ構造)は可変引数関数(ない可変引数関数かかわらテンプレート、楕円を使用して単純な可変引数関数)の引数として渡すことができます。

std::stringはPODではないですが、あなたが行うことができます。

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

c_str() member functionは、カプセル化されたC文字列にconst char*を返します。

+0

両方の回答に感謝します。 – user2369405

+0

@ user2369405:うれしかった –

3

printf%sフォーマット指定子で使用する場合は、charへのポインタが必要です。あなたがc_str()メソッドを介してstd::stringからそれを得ることができます。

void displayinfo(const string& filename) { .... } 
:余談として

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

、変更または入力文字列をコピーする予定がない場合は、あなたがconst参照渡しする必要があることに注意してください

0

私はネットが沈黙することを真剣に疑っています。たぶんあなたは間違った場所を見たり、ナイトキーウォーカーを使用したりしました。

基本ルールは単純で、非PODとして渡す...引数は未定義の動作です。実装で何らかの動作が定義されていて、それがあなたのタスクと一致しない限りは、実行しないでください。

特にprintfファミリの場合、書式文字列には特定の型が渡される必要がありますが、PODを渡しても破損してしまいます。

関連する問題