我想创建一个可以比较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个字符串。
答案 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));
}
在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;
}
答案 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;
}