Как сравнить строки и целые числа, определенные #define? - PullRequest
1 голос
/ 10 июля 2019

У меня есть следующий код C ++:

#define VERSION        1
#define TYPE           "this"
...

bool update(const char* json) {
    ...
    const char* theType = doc["type"];     // "this"
    int theVer          = doc["version"];  // 2

    //int ourVer        = VERSION;
    //char ourType[]    = TYPE;

    if ( (theVer > VERSION) && (theType == TYPE) ) {
        return true
    } else {
        return false;
    }
}

Я могу напечатать как theType, так и theVer, но я не могу успешно сравнить их с константами. Я также пытался сравнить с приведенными константами (закомментированными) безрезультатно.

Как сравнить строки и целые числа, определенные #define?

КСТАТИ. Это закодировано в ArduinoIDE.

Ответы [ 5 ]

3 голосов
/ 10 июля 2019

theType == TYPE сравнивает два указателя. Он возвращает истину тогда и только тогда, когда адреса совпадают, что здесь не так.

Используйте strcmp вместо:

if (theVer > VERSION && std::strcmp(theType, TYPE) == 0) {
    // ...
}

strcmp выполняет трехстороннее сравнение фактических строк, возвращая число, равное < 0, == 0 или > 0, когда первая строка меньше, равна или больше второй. Для этого вам нужно #include <cstring>.

2 голосов
/ 10 июля 2019

Я знаю, что ответ Л.Ф. уже принят, но я хотел бы выразить несогласие с их советом использовать strcmp.Вы даже не должны больше использовать #define, а constexpr.Это позволяет вам быть ясным при наборе текста и, по моему опыту, constexpr лучше играть с intellisense.

То, что вы должны использовать для TYPE, равно constexpr std::string_view.что не заставит вас использовать старые библиотеки c и может быть сравнено с std::string с помощью оператора ==.

#include <string_view>
#include <string>

constexpr int THIS = 1;
constexpr std::string_view TYPE = "this";
...

bool update(const std::string & json) {
    ...
    std::string theType = doc["type"]; // "this"
    int theVer = doc["version"];  // 2

    if ( (theVer > VERSION) && (theType == TYPE) ) {
        return true
    } else {
        return false;
    }
}

https://en.cppreference.com/w/cpp/language/constexpr https://en.cppreference.com/w/cpp/string/basic_string_view

1 голос
/ 10 июля 2019

#define не имеет значения.

После предварительной обработки ваш фрагмент в точности соответствует:

bool update(const char* json) {
    const char* theType = doc["type"];     // "this"
    int theVer          = doc["version"];  // 2

    if ( (theVer > 1) && (theType == "this") ) {
        return true
    } else {
        return false;
    }
}

Таким образом, проблема сводится к тому, «как мы сравниваем две C-строки?», С гораздо более простым примером, подобным этому:

int main()
{
   const char* theType = "this";
   const bool  matches = (theType == "this");
}

Ответ такой: не с ==, а с strcmp.

0 голосов
/ 10 июля 2019

Может быть, этот код поможет вам:

bool func()
{
    const string str = "value";
    int number = 3;
    return str == const_string && number == const_number ? true : false;
}
0 голосов
/ 10 июля 2019
#define VERSION        1
#define TYPE           "this"
...

bool update(const char* json) {
   ...
   const char* theType = doc["type"];     // "this"
   int theVer          = doc["version"];  // 2

   return (theVer > VERSION) && !strcmp(TYPE,theType) ;
}
...