Search code examples
c++strcmprapidxml

!strcmp as substitute for ==


I'm working with rapidxml, so I would like to have comparisons like this in the code:

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

This gives the following warning:

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

Is it a good idea to substitute it with:

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

Which gives no warning?

The latter looks ugly to me, but is there anything else?


Solution

  • You cannot in general use == to compare strings in C, since that only compares the address of the first character which is not what you want.

    You must use strcmp(), but I would endorse this style:

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

    rather than using !, since that operator is a boolean operator and strcmp()'s return value is not boolean. I realize it works and is well-defined, I just consider it ugly and confused.

    Of course you can wrap it:

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

    then your code becomes the slightly more palatable:

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

    Note: I use the bool return type, which is standard from C99.