我需要结合以下两个函数(第二个作为争论 第一个的返回值)到一个宏。
#define SetDSTimeHours(a,b)
uint8_t FormatDSMode(char data,char mode);
void SetDSData(char address,char data);
这些功能可以按照预期工作,但我找不到放置的方法 他们在一个宏观中。 所以,基本上我需要的是像这样的宏,它可以工作:
#define SetDSTimeHours(a,b) {\uint8_t (c)=FormatDSMode(a,b);\SetDSData(0x02,(c));\}
答案 0 :(得分:0)
这取消了中间变量:
#define SetDSTimeHours(a_, b_) SetDSData(0x02,(char)(FormatDSMode((a_),(b_))))
答案 1 :(得分:0)
首先,要使宏正常工作,请将其置于do while false循环中:它允许您将它与if语句一起使用,而不会给出语法错误。
分别用do {
和} while (false)
替换大括号。
考虑到uint8_t c
仅用于函数调用SetDSData
,请更改宏以使用FormatDSMode作为SetDSData的参数。
您的代码应该成为:
#define SetDSTimeHours(a, b) do { SetDSData(0x02, FormatDSMode(a, b)) } while (false)
当然,你不需要用do while(false)包围一个语句,所以你可以写:
#define SetDSTimeHours(a, b) SetDSData(0x02, FormatDSMode(a, b))
这只是此实例的解决方法;它不会一直有效。宏是邪恶的,通常应该用内联函数替换。一个更好的例子是:
inline void SetDSTimeHours(char a, const char b) {
uint8_t c = FormatDSMode(a, b);
SetDSData(0x02, c);
}
使用内联函数可以轻松地声明变量。