0

私はrapidxmlで作業しているので、コードで次のような比較をしたいと思います:

if ( searchNode->first_attribute("name")->value() == "foo" )

これにより、次の警告が表示されます。

comparison with string literal results in unspecified behaviour [-Waddress]

それを次のものに置き換えるのは良い考えですか?

if ( !strcmp(searchNode->first_attribute("name")->value() , "foo") )

警告を出さないのはどれ?

後者は私には醜く見えますが、他に何かありますか?

4

4 に答える 4

4

一般に、C で文字列を比較するために使用することはできませ==ん。これは、最初の文字のアドレスを比較するだけであり、必要なものではないためです。

を使用する必要がありますstrcmp()が、次のスタイルを推奨します。

if( strcmp(searchNode->first_attribute("name")->value(), "foo") == 0) {  }

を使用するのではなく!、その演算子はブール演算子であり、strcmp()の戻り値はブール値ではないためです。私はそれが機能し、明確に定義されていることを理解していますが、それは醜くて混乱していると思います.

もちろん、それをラップすることができます:

#include <stdbool.h>

static bool first_attrib_name_is(const Node *node, const char *string)
{
    return strcmp(node->first_attribute("name")->value(), string) == 0;
}

次に、コードが少し口当たりが良くなります。

if( first_attrib_name_is(searchNode, "foo") ) {  }

注: boolC99 の標準である戻り値の型を使用します。

于 2013-05-10T11:14:56.003 に答える
2

がまたはをvalue()返す場合、選択の余地はほとんどありません。または、長さを制限する代替手段の 1 つが必要です。return に変更できる場合は、 の使用に戻ることができます。char*const char*strcmpvalue()std::string==

于 2013-05-10T11:14:11.947 に答える
1

いくつかのオプションがあります:

使用できますがstrcmp、ラッピングをお勧めします。例えば

bool equals(const char* a, const char* b) {
    return strcmp(a, b) == 0;
}

次に、次のように記述できます。if (equals(searchNode->first_attribute("name")->value(), "foo"))


戻り値を a に変換し、演算子std::stringを使用できます==

if (std::string(searchNode->first_attribute("name")->value()) == "foo")

これにより、コンテキストによっては望ましくない文字列コピー操作が発生します。


文字列参照クラスを使用できます。文字列参照クラスの目的は、実際の文字列の内容を所有しない文字列のようなオブジェクトを提供することです。これらのいくつかを見たことがありますが、独自に記述するのは簡単ですが、Boost には文字列参照クラスがあるため、それを例として使用します。

#include <boost/utility/string_ref.hpp>
using namespace boost;

if (string_ref(searchNode->first_attribute("name")->value()) == string_ref("foo"))
于 2013-05-10T11:29:09.703 に答える
1

char* 型を "==" と比較するときは、ポインターを比較するだけです。「==」で比較したい場合は、C++ 文字列型を使用してください

于 2013-05-10T11:18:48.350 に答える