在以下宏功能中,问题是什么:
#define STACK(x,y) (x=(int8_t)y)
在上面的宏定义中,它会返回任何意外的输出
答案 0 :(得分:0)
宏不返回值,它们只是在预处理步骤中被替换的构造。
现在想象一下调用你的STACK宏:
STACK(x++, y++)
STACK(x, x++)
虽然它看起来像是一个非常有效的C语法,但在案例1中扩展您的特定宏会出现语法错误,但在案例2中会按预期工作。因此它是一个令人困惑的构造。
答案 1 :(得分:0)
这种宏应该以不值的价格避免,因为它们不可读,不易犯错并且容易出错。使用内联函数代替,您将进行类型检查,并且易于维护理解和调试。你的例子是非常微不足道的(甚至太微不足道了)
inline uint8_t to_uint8_t(int x)
{
return x; // cast will done automaticly
}
或者如果你想要宏不在其中进行分配
#define TO_UINT8_T(x) ((uint8_t)(x))
然后在代码中分配值
x = to_uint8_t(y);
z = TO_UINT8_T(w);