包含返回函数的宏

时间:2013-12-24 22:44:47

标签: c function macros

我需要结合以下两个函数(第二个作为争论  第一个的返回值)到一个宏。

#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));\}

2 个答案:

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

使用内联函数可以轻松地声明变量。