调试宏中的简写

时间:2017-08-07 08:39:48

标签: c macros preprocessor

下面的陈述是一种简写吗?我需要有人帮助我理解它。

#define clean_errno()(errno == 0? "None": strerror(errno)) 

从执行结果来看,我想这意味着一旦我面对clean_errno(),如果errno ==0,我将clearn_errno()替换为None,如果没有,我会替换{{1与clean__errno()一起使用。但我不知道如何逻辑地分析这个陈述?

2 个答案:

答案 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 elsechar * str = if ...可能无法正常工作)效果不佳。

尝试使用0 ? "true" : "false"并测试一下。

祝你好运!