【发布时间】:2018-01-10 07:56:09
【问题描述】:
在我的 C 项目中,有一个结构,由另一位同事创建,包含一些函数指针:
struct tools {
int (*tool_a) (int, int, int);
...
};
我无权更改此结构和相关文件。
现在我正在使用结构进行编码。
我必须定义一个函数,它的返回类型和参数列表必须与tools.tool_a相同。
这意味着我的功能必须如下:
int my_func(int, int, int);
问题是struct改了很多,尤其是返回类型,比如int今天换成了size_t,所以我的代码要改很多。
我知道 C++ 中的 decltype 可以帮助我,所以我只想知道 C 是否有等价的东西?
我在想我可以使用宏,但我不知道如何,我什至不知道这是否可能。
真实案例
我正在用 C 开发一些用于 linux-kernel 的测试工具。
我公司的其他团队有很多版本的自定义内核。由于历史原因,有的用int,有的用size_t或ssize_t等等。
现在当我编码时,我必须这样做:
// int my_func(int a, int b, int c)
size_t my_func(int a, int b, int c)
// ssize_t my_func(int a, int b, int c)
{}
struct tools my_tool = {
.tool_a = my_func;
}
我必须不断评论和取消评论...
【问题讨论】:
-
"我无权更改此结构,但结构变化很大。"这有什么意义?如果人们无论如何都在更改代码,只需强制使用 typedef。
-
请记住,在 C 中,
tools是一种数据类型,而不是可以在其上使用成员访问运算符的变量。 -
顺便说一句,尽管您正在寻找与 C++ 等效的工具,但我认为它并不需要 C++ 标签。
-
所以基本上,您有
1..N组为您提供代码,并且您希望对这些N代码运行相同的测试。每次从x组获取代码时,签名都是相同的,但当您从y组获取代码时,签名可能会有所不同。也许您可以为每个组定义一个唯一的符号并更改您的编译过程以包含此符号,例如make GROUP=x。然后剩下的就是一个预处理器条件,它根据GROUP值启用不同的函数签名。 -
@Yves 我明白了。然后我想我想出了一个解决方法,请参阅下面的答案。