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

时间:2018-07-01 13:12:32

标签: c c-preprocessor preprocessor-directive

有人可以告诉我为什么当我尝试使用我的ERROR宏返回1时,Visual Studio给我一个错误吗? 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 :(得分:6)

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()可以返回与0不同的错误状态,并返回0表示成功。这是大多数系统在UNIX系统上调用报告成功和失败的方式,这也是main()应该向系统报告成功操作的方式。

答案 1 :(得分:1)

您必须从宏声明中删除;

然后在您的strcmp中删除*,因为您将char作为参数传递

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

答案 2 :(得分:0)

我认为现代C / 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字符串(等),几乎没有哲学上的问题,但我认为这是没有主题的。