调试宏中的简写

Com*_*non 0 c macros preprocessor

以下声明是一种简写吗?我需要有人帮助我理解它.

#define clean_errno()(errno == 0? "None": strerror(errno)) 
Run Code Online (Sandbox Code Playgroud)

从执行结果,我想这意味着一旦我面对clean_errno(),如果errno ==0我更换clearn_errno()None,如果没有,我代替clean__errno()strerror(errno).但我不知道如何从逻辑上分析这个陈述?

Som*_*ude 6

预处理器宏在其调用站点中被替换.

这意味着像

printf("Error = %s\n", clean_errno());
Run Code Online (Sandbox Code Playgroud)

将被替换为

printf("Error = %s\n", (errno == 0? "None": strerror(errno)));
Run Code Online (Sandbox Code Playgroud)

然后在运行时打印"None"if errno == 0,否则打印结果strerror(errno).

至于?:表达式本身,它是条件(也就是三元)表达式,它的作用类似于a if-else.

但是,使用像这样的宏不是我推荐的,因为errno如果函数没有失败,通常是未定义的值.您需要确保先前的函数在检查之前确实失败了errno,在这种情况下它永远不会为零.errno除非您事先专门执行此操作并且知道您调用的函数不会修改它,除非出现错误,否则很少有地方会重置为零.