我最近继承了一些(未记录的(C代码,其中包含此模式的多个实例:
void my_function(void *_foo, const void *_bar) {
MyType *foo = (MyType *)_foo;
MyType *bar = (MyType *)_bar;
我对 C 非常熟悉,但我一生都无法弄清楚为什么该函数会消耗空指针。如果错误类型在任何地方传递,这不就是为了抑制可能有用的编译器警告吗?还是我刚开始的背后有合理的方法?
通常,void *
用作抽象,即您可以使用void *
将不同类型的指针传递给函数,稍后根据适当的条件,您可以将void *
类型转换为正确的类型并使用它。
另一种用法可能是当调用函数位于逻辑上独立的单元(如库(中,并且无法访问指针所属的正确类型时。但是,数据仍然必须通过该函数。
我曾经将这种抽象机制与回调一起使用。例如,如果我正在调用一个函数库,该函数最终调用我的回调,并且我希望在我的回调中有一些应用程序数据,但是,库函数没有使用它,那么我将void *
将此类数据类型传递给库函数并在回调中接收该数据时, 我会将其类型转换为适当的类型并使用它。