最近,我就GLib中的某些代码问了同样的问题。(GLib是GNOME项目的核心库,用C编写。)有人告诉我,整个slot'n'signals框架都依赖于它。
在整个代码中,存在从类型(1)到(2)的大量转换实例:
typedef int (*CompareFunc) (const void *a,
const void *b)
typedef int (*CompareDataFunc) (const void *b,
const void *b,
void *user_data)
像这样的调用通常是直通的:
int stuff_equal (GStuff *a,
GStuff *b,
CompareFunc compare_func)
{
return stuff_equal_with_data(a, b, (CompareDataFunc) compare_func, NULL);
}
int stuff_equal_with_data (GStuff *a,
GStuff *b,
CompareDataFunc compare_func,
void *user_data)
{
int result;
result = compare_func (data1, data2, user_data);
return result;
}
在以下位置亲自查看g_array_sort()
:http : //git.gnome.org/browse/glib/tree/glib/garray.c
上面的答案很详细,可能很正确-如果您是标准委员会的成员。亚当(Adam)和约翰内斯(Johannes)为他们精心研究的回应值得称赞。但是,在野外,您会发现此代码可以正常工作。有争议吗?是。考虑一下:GLib在具有多种编译器/链接器/内核加载器(GCC / CLang / MSVC)的大量平台(Linux / Solaris / Windows / OS X)上进行编译/工作/测试。我猜这是该死的标准。
我花了一些时间思考这些答案。这是我的结论:
- 如果您正在编写一个回调库,则可以。警告购买者-使用后果自负。
- 否则,不要这样做。
编写此响应后,请进行更深入的思考,如果C编译器的代码使用相同的技巧,我也不会感到惊讶。而且,由于(大多数/全部?)现代C编译器是自举的,因此这意味着该技巧是安全的。
需要研究的一个更重要的问题:有人可以找到无法使用此技巧的平台/编译器/链接器/加载器吗?那个的主要布朗尼分。我敢打赌有些嵌入式处理器/系统不喜欢它。但是,对于桌面计算(可能还有移动/平板电脑),此技巧可能仍然有效。