有人可以告诉我为什么当我尝试使用我的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;
}
答案 0 :(得分:6)
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()
应该向系统报告成功操作的方式。
答案 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字符串(等),几乎没有哲学上的问题,但我认为这是没有主题的。