“?”在C宏定义中标记

时间:2014-09-09 11:19:27

标签: c

我经常在stm32f0的通用代码中找到一行,但我无法清楚地理解它。下面这行是什么意思。我知道这种方式很难理解。但我的观点是定义中的问号(?)。有人可以解释一下。

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))

3 个答案:

答案 0 :(得分:2)

  

在C中,它的真正用处在于它是一个表达式而不是一个表达式   声明;也就是说,你可以把它放在a的右侧(RHS)   声明。所以你可以更简洁地写出某些东西。

来源:The ternary (conditional) operator in C

聚苯乙烯。我会使用评论,但由于50的声誉限制,这是不可能的。

答案 1 :(得分:1)

这里使用条件运算符。 它表示如果expr为true,那么宏assert_param(expr)的值将为零或其他 它将调用另一个宏或函数assert_failed(),并将两个参数作为输入。 第一个是 FILE 宏,它是调用宏的文件名,另一个是 LINE macro,它是调用宏的文件中的行号。

条件运算符格式如下:

a?b:c

这意味着如果a为真,那么b将是结果,否则c将是结果。 因此,您可以在表达式中分隔这些语句。

答案 2 :(得分:1)

这是一种短暂的状态, 你可以写

int k = (i > j) ? i : j;

如果i > j,它会将我指向k,否则它将对齐。 这是我们在宏

中选择两个选项的方式