如何在编译时静态比较两个字符串

时间:2014-12-15 18:40:32

标签: c++ xcode macros compiler-errors gnu

我想创建一个可以比较2个字符串的宏,如果不满足条件则发出编译时错误。这可能是编译时断言。

我不确定我该怎么做。

例如:

STATIC_COMPARE("THIS STRING","THIS STRING") -> would emit a compile time error
STATIC_COMPARE("THIS STRING","THIS OTHER STRING) -> wouldn't emit a compile time error.

宏看起来像

#define STATIC_COMPARE(str1,str2) if (str1==str2) emit an error with a message

所以我想问题归结为能够在编译时比较2个字符串。

4 个答案:

答案 0 :(得分:10)

您可以使用constexpr函数在C ++ 11中执行此操作:

constexpr bool strings_equal(char const * a, char const * b) {
    return *a == *b && (*a == '\0' || strings_equal(a + 1, b + 1));
}

See a demo

在C ++ 11之前不可能这样做,但需要注意的是,许多编译器会将相等的字符串文字编译为指向同一位置的指针。在这些编译器上,直接比较字符串就足够了,因为它们都被评估为相等的指针。

答案 1 :(得分:6)

您可以使用constexpr个功能。这是C ++ 14的方式:

constexpr bool equal( char const* lhs, char const* rhs )
{
    while (*lhs || *rhs)
        if (*lhs++ != *rhs++)
            return false;
    return true;
}

Demo

答案 2 :(得分:1)

这可以使用constexpr在C ++ 11中完成。通过定义递归函数,您可以检查字符串是否相等。

constexpr bool isequal(char const *one, char const *two) 
{
    return (*one && *two) ? (*one == *two && isequal(one + 1, two + 1)) : (!*one && !*two);
}

static_assert(isequal("foo", "foo"), "this should never fail");
static_assert(!isequal("foo", "bar"), "this should never fail");

我使用的代码感谢Johannes Schaub,您可以看到完整的SO帖子here

答案 3 :(得分:1)

从C ++ 17 std::string_view开始可用。它支持constexpr比较:

#include <string_view>

constexpr bool strings_equal(char const * a, char const * b) {
    return std::string_view(a)==b;
}

int main() {
    static_assert(strings_equal("abc", "abc" ), "strings are equal");
    static_assert(!strings_equal("abc", "abcd"), "strings are not equal");
    return 0;
}

Demo