下面的陈述是一种简写吗?我需要有人帮助我理解它。
#define clean_errno()(errno == 0? "None": strerror(errno))
从执行结果来看,我想这意味着一旦我面对clean_errno()
,如果errno ==0
,我将clearn_errno()
替换为None
,如果没有,我会替换{{1与clean__errno()
一起使用。但我不知道如何逻辑地分析这个陈述?
答案 0 :(得分:6)
预处理器宏在其呼叫站点中被替换。
这意味着像
这样的陈述printf("Error = %s\n", clean_errno());
将替换为
printf("Error = %s\n", (errno == 0? "None": strerror(errno)));
然后在运行时打印"None"
errno == 0
,否则打印strerror(errno)
的结果。
至于?:
表达式本身,它是conditional (a.k.a. the ternary) expression,它与if-else
类似。
但是,使用这样的宏不是我建议的,因为如果函数没有失败,errno
的值通常是未定义的。在检查errno
之前,您需要确保先前的函数确实失败,在这种情况下它永远不会为零。除非您事先专门执行此操作并且知道您调用的函数将不会修改它,除非出现错误,否则errno
将重置为零的位置很少。
答案 1 :(得分:2)
在运行时评估代码并遵循简写:
condition ? if_true : if_false
此简写与常规if else
声明非常相似。
然而,与C中的普通if else
不同,速记可以用作表达式和语句。即:
char * str = 1 ? "true" : "false";
...使用if else
(char * str = if ...
可能无法正常工作)效果不佳。
尝试使用0 ? "true" : "false"
并测试一下。