比较字符串时返回 1 时出错

Error returning 1 when comparing strings

任何人都可以告诉我为什么 Visual Studio 在我尝试使用我的 define ERROR 宏尝试 return 1 时给我一个错误吗? 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;

}

ERROR 的定义包含尾随 ;,当 ERRORif (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() 可能 return 错误状态,不同于 0 和 return 0 成功。这是大多数系统调用在 unix 系统上报告成功和失败的方式,这也是 main() 应该向系统报告成功操作的方式。

您必须从宏声明中删除 ;

并且在你的 strcmp 中删除 * 因为你传递的是一个字符作为参数

参见:https://en.wikipedia.org/wiki/Dereference_operator 有关此的更多信息;)

在我看来,现代 C/C++ 代码应该像这里一样定义字符串常量(同意,标识符应该按照常见的 C 规则转换为小写。f.e。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 字符串(等)几乎不存在哲学问题,但我假设题外话。