2016-04-26 8 views
2

私はC++のRubyバックグラウンドの学習/使用を開始しました。C++:警告:文字列リテラルとの比較結果が不特定の動作となる[-Waddress]

誰かが私に以下のコードを教えてもらえますか?

私が間違って何見当がつかないが、それは、このエラーメッセージを引き起こしている:

C++:警告:[-Waddress]

void OnUserConnect(LocalUser* user) 
{ 
    if (user->MyClass->name.c_str() == "user") { 
     ServerInstance->SNO->WriteToSnoMask('a', "Triggered: %s", user->MyClass->name.c_str()); 
    } 
} 

答えて

3

あなた不定 行動で文字列リテラル結果との比較を比較user->MyClass->name.c_str() == "user"は、2つのポインタと、決して同じではない2つのポインタを比較します。あなたは直接ポインタを取得することなく、平等comparison operatorを使用することができますstd::stringを使用しているように見えるので

if (user->MyClass->name == "user") { ... } 

あなたはCスタイルの文字列を使用して比較したいいくつかの奇妙な理由での場合ポインタの場合は、std::strcmpを使用する必要があります。

+0

ありがとう、これは質問を解決しました。通知で '.c_str()'を使う必要があるのはなぜですか? – user6213803

+0

@ user6213803あなたは 'WriteToSnoMask'呼び出しを意味しますか?その関数はおそらくCスタイルの文字列であり、C++の 'std :: string'オブジェクトではないと期待しています。 –

+1

@ user6213803。 'WriteToSnoMask(char letter、const char * text、...)'は書式設定文字列( 'printf'に似ています)を使います。"文字列 "フォーマッタ'%s'はCスタイルの文字列 'char *' 'std :: string'では動作しません。 – Niall

0

char*変数とconst char*リテラルを比較することはできません。この比較を使用する場合は、strcmp機能を使用する必要があります。あなたは以下の条件をあなたのものに置き換えることができます

if(!strcmp(user->MyClass->name.c_str(),"user") 
関連する問題