I would like to create a macro which can compare 2 strings, and emit a compile time error if the condition isn't met. This could be though of as a compile time assertion.
I'm not sure how I could do this.
For instance:
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.
The macro would look something like
#define STATIC_COMPARE(str1,str2) if (str1==str2) emit an error with a message
So I guess the question boils down to being able to compare the 2 strings at compile time.
In other words, strings are compared letter-by-letter. The algorithm to compare two strings is simple: Compare the first character of both strings. If the first character from the first string is greater (or less) than the other string's, then the first string is greater (or less) than the second.
strcmp() in C/C++ This function is used to compare the string arguments. It compares strings lexicographically which means it compares both the strings character by character. It starts comparing the very first character of strings until the characters of both strings are equal or NULL character is found.
For example, you can check whether two objects are equal (equality) by using a double equals sign == . We can see if the logical value of TRUE equals the logical value of TRUE by using this query TRUE == TRUE .
You can do this with C++11 by using a constexpr
function:
constexpr bool strings_equal(char const * a, char const * b) {
return *a == *b && (*a == '\0' || strings_equal(a + 1, b + 1));
}
(See a demo)
It's not possible to do this prior to C++11, with the caveat that many compilers will compile equal string literals to be a pointer to the same location. On these compilers it's sufficient to compare the strings directly since they will both be evaluated as equal pointers.
Starting with C++17 std::string_view is available. It supports constexpr comparisson:
#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
You can use constexpr
functions. Here's the C++14 way:
constexpr bool equal( char const* lhs, char const* rhs )
{
while (*lhs || *rhs)
if (*lhs++ != *rhs++)
return false;
return true;
}
Demo.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With