这可以通过反转尝试的方法来实现。
#define defLedClkFunc(name) void (name)(uint16_t led)
typedef defLedClkFunc(tLedClkFunction);
//********************************************************
//
// Declaration of first function
//
defLedClkFunc(ledClkEnable)
{
// Body of first function
} // ledClkEnable()
//********************************************************
//
// Declaration of second function
//
defLedClkFunc(ledClkDisable)
{
// Body of second function
} // ledClkDisable()
//
// Create an array of pointers to the functions
//
tLedClkFunction *myFuncs[] = {
ledClkEnable,
ledClkDisable,
};
现在您有了函数签名的单点定义,并且对签名的任何更改都会通过所有 typedef 和函数声明传播。
我发现这对于定义函数集(例如中断处理程序、消息处理程序)非常有用。
此外,如果有人决定它们都应该有一些任意的前缀和/或后缀,宏使得更改所有函数名称变得很简单。只需将标记粘贴用作宏定义的一部分,然后将所需的前缀/后缀粘贴到name
.
您确实需要记住为操作指向函数的指针而创建的数据类型,但即使这样也可以通过微不足道的额外宏魔术自动适应。