C 使用宏的缺点

C 使用宏的缺点,c,C,在以下宏功能中,问题是什么: #define STACK(x,y) (x=(int8_t)y) 在宏的上述定义中,它是否会返回任何意外的输出宏不返回值,它们只是在预处理步骤中被替换的结构 现在想象一下这样调用堆栈宏: STACK(x++, y++) STACK(x, x++) 虽然它看起来像是一个完全有效的C语法,但在案例1中,它在扩展特定宏时可能是一个语法错误,但在案例2中会像预期的那样工作。因此,这是一个令人困惑的结构。这种宏不应该以任何代价被避免,因为它们不可读、不可调试且容易出错。改

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

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

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

宏不返回值,它们只是在预处理步骤中被替换的结构

现在想象一下这样调用堆栈宏:

STACK(x++, y++)
STACK(x, x++)

虽然它看起来像是一个完全有效的C语法,但在案例1中,它在扩展特定宏时可能是一个语法错误,但在案例2中会像预期的那样工作。因此,这是一个令人困惑的结构。

这种宏不应该以任何代价被避免,因为它们不可读、不可调试且容易出错。改用内联函数,您将进行类型检查,并且易于维护、理解和调试。你的例子非常琐碎(甚至太琐碎而毫无意义)

或者,如果需要宏,请不要在宏中执行赋值

#define TO_UINT8_T(x)  ((uint8_t)(x))
然后在代码中指定值

x = to_uint8_t(y);

z = TO_UINT8_T(w);

你认为预期的输出是什么?如果我使用
STACK(5,6)?然后将其展开为
(5=(int8_t)6)像这样奇怪的宏从来都不是个好主意。
x = to_uint8_t(y);

z = TO_UINT8_T(w);