1
std::string sAttr("");
sAttr = sAttr+VAL_TAG_OPEN+sVal->c_str()+VAL_TAG_CLOSE;

私が定義したコードの他の場所

const char VAL_TAG_OPEN[]   = "<value>";

sVal文字列ポインターの配列から取得される変数です。これは、ほとんどのシステム、Windows、および Linux で正常に機能します。しかし、顧客のサイトでは、広範囲にわたるテストを行った Linux のバージョンがあると信じられていますが、VAL_TAG_OPENと を使用したことがないかのような結果が得られVAL_TAG_CLOSEます。私が受け取る結果は

sAttr = sAttr+sVal->c_str();

どうしたの ?。std::string 連結はランタイムによって異なりますか?

4

4 に答える 4

2

なぜ->c_str()ですか?sValが の場合std::string、この呼び出しを削除してみてください。評価の順序は定義されていないことに注意してください。したがって、文字列を連結する代わりにポインターを追加することになる可能性がVAL_TAG_OPENありsVal->c_str()ますVAL_TAG_CLOSE。加算代入演算子を使用することをお勧めします+=。たとえば、次のようになります。

sAttr += VAL_TAG_OPEN;
sAttr += *sVal; /* sVal->c_str() ? */
sAttr += VAL_TAG_CLOSE;

(とにかく速いはずです)。

于 2009-02-12T10:59:33.887 に答える
1

問題の原因となっている評価の順序は気にしません。先頭と末尾の定数 char 配列が原因です

const char VAL_TAG_OPEN[]   = "<value>";
const char VAL_TAG_CLOSE[]  = "</value>"

連結演算子は、VAL_TAG_OPN と VAL_TAG_CLOSE をヌル ターミネータ文字列ではないと認識しました。したがって、オプティマイザーはそれらをゴミと見なして無視しました。

sAttr += std::string(VAL_TAG_OPEN);
sAttr += *sVal;
sAttr += std::string(VAL_TAG_CLOSE);

これで解決します。

于 2009-02-16T20:29:31.397 に答える
0
sAttr = sAttr+VAL_TAG_OPEN+sVal->c_str()+VAL_TAG_CLOSE;

fbonnetが言ったように、それは評価の問題の順序です。

その行が厳密に左から右に評価される場合、各加算の結果は std::string オブジェクトであり、これには加算用の演算子のオーバーロードがあり、期待どおりに機能します。

左から右に評価されない場合は、ポインターを一緒に追加することになり、それが何をもたらすかは誰にもわかりません。

この構成を避け、std::string で += 演算子を使用してください。

于 2009-02-12T14:51:58.007 に答える