Ошибка возврата 1 при сравнении строк - PullRequest
0 голосов
/ 01 июля 2018

Может кто-нибудь сказать мне, почему Visual Studio выдает ошибку, когда я пытаюсь вернуть 1, используя мой макрос определения ERROR? VS говорит, что ожидает скобку: /

#define ERROR "A generic error has occured";

const char *RetAdapters(int *adapters) {

    if(...) {} 

    else
        return ERROR;
} 


int main()
{
    const char *ret = RetAdapters(&input);

    if (strcmp(*ret, ERROR) == 0) {
        return 1;
    }

    return 0;

}

Ответы [ 3 ]

0 голосов
/ 01 июля 2018

Вы должны удалить ; из вашего объявления макроса

И в вашем strcmp удалите *, потому что вы передаете символ в качестве параметра

См .: https://en.wikipedia.org/wiki/Dereference_operator для получения дополнительной информации об этом;)

0 голосов
/ 01 июля 2018

По моему мнению, современный код C / C ++ должен определять строковые константы, как здесь (согласитесь, идентификатор должен быть преобразован в нижний регистр по общим правилам языка Си. Например: Error_msg)

const char ERROR[]= "A generic error has occured";

каждая следующая задача безболезненно контролируется компилятором

const char *RetAdapters(int *adapters) {

    if(...) {} 

    else
        return ERROR;
} 

и

if (strcmp(ret, ERROR) == 0) { ... 

ОБНОВЛЕНИЕ: существует несколько философских вопросов о копировании, сравнении строк C (и т. Д.), Но я полагаю, что это не по теме.

0 голосов
/ 01 июля 2018

Определение ERROR содержит конечный ;, который вызывает синтаксическую ошибку, когда ERROR раскрывается в if (strcmp(*ret, ERROR) == 0) {

Удалите ; из определения макроса, а также удалите косвенное указание *:

#define ERROR "A generic error has occurred"

const char *RetAdapters(int *adapters) {
    if (...) {
        ... 
    } else {
        return ERROR;
    }
} 

int main() {
    const char *ret = RetAdapters(&input);

    if (strcmp(ret, ERROR) == 0) {
        return 1;
    }
    return 0;
}

Обратите внимание, что этот стиль программирования не рекомендуется:

  • ERROR можно определить как глобальную переменную:

    const char ERROR[] = "A generic error has occurred";
    
  • RetAdapters() может вернуть состояние ошибки, отличное от 0, и вернуть 0 в случае успеха. Именно так большинство системных вызовов сообщает об успехах и неудачах в системах Unix, и именно так main() должен сообщать системе об успешной работе.

...