使用宏的缺点

时间:2017-10-06 07:21:10

标签: c

在以下宏功能中,问题是什么:

#define STACK(x,y) (x=(int8_t)y)

在上面的宏定义中,它会返回任何意外的输出

2 个答案:

答案 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);