【发布时间】:2018-01-31 10:45:21
【问题描述】:
我想做这样的事情
#define GREATER_THAN_ZERO(a) a>0? 1:0
在另一个类似的函数中使用这个宏
void test(int x)
{ if (GREATER_THAN_ZERO(x) == 1) printf("more than zero");
else printf("less than zero");
}
但是当我使用测试功能时,它总是打印“小于零” 注意:这是一个例子,不是真实情况,但我想做类似的事情(在函数中使用宏) 任何人都可以帮助我吗? 编辑 我有这样的配置文件
#define LED_u8_MODE_0 LED_u8_REVERSE
#define LED_u8_MODE_1 LED_u8_NORMAL
在程序中我有一个宏函数
#define LED_u8_GET_MODE(LED_u8_INDX) (LED_u8_INDX == 0)? LED_u8_MODE_0: \
(LED_u8_INDX == 1)? LED_u8_MODE_1: \
(LED_u8_INDX == 2)? LED_u8_MODE_2: \
(LED_u8_INDX == 3)? LED_u8_MODE_3: 800
然后我在这个函数中使用它
void LED_voidSetLedOnWithIndx(u8 Copy_u8LedIndx)
{
if(LED_u8_GET_MODE(Copy_u8LedIndx) == LED_u8_NORMAL)
{
DIO_voidSetPinValue(Copy_u8LedIndx, DIO_u8_HIGH);
}
else //if(LED_u8_GET_MODE(Copy_u8LedIndx) == LED_u8_REVERSE)
{
DIO_voidSetPinValue(Copy_u8LedIndx, DIO_u8_LOW);
}
}
【问题讨论】:
-
显示一个最小的代码示例,展示引用的问题,读者可以使用它来复制它。如果这不是你的真实案例,请给出一个并非完全愚蠢的真实案例。你引用的宏远比写
thing > 0糟糕得多,而且会激怒你的代码的读者。另外,为什么是? 1 : 0?你知道它已经返回了一个布尔值,对吧? -
显示一个最小的代码示例,展示引用的问题,读者可以使用它来复制它。目前,我们只有一个不完整的片段和您关于它导致问题的声明,没有证据表明问题行为是如何产生的。我们可以自己编写测试来证明或反驳您所说的,但这不是我们的工作。
-
标准保证 C 中的比较运算符无论如何都返回 0 或 1,因此三元运算符毫无用处...
-
安全宏应始终将参数放入括号中,整个宏也应如此,所以:
GTZ(a) ((a)>0?1:0)或简单地说(考虑我之前的评论!):GTZ(a) ((a)>0) -
@AjayBrahmakshatriya 我不知道你在说什么。不需要
== 1;>运算符已经返回了0或1的结果,它保证在任何布尔上下文中都能正确运行,并且我所见过的所有良好的编码风格都不鼓励明确比较布尔值的某些值。跨度>
标签: c c-preprocessor preprocessor