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