我考虑应该如何void *
正确使用(我与C语言有所不同)。我记得void *
用来启用将任何参数传递给回调函数的功能。我知道可以将类似原始类型int *
,constchar *
甚至值集合的值作为传递struct attributes *
。
我考虑将指针传递给函数void *
是否可以。
例如
typedef void (*callback_t)(void *);
typedef void (*my_custom_callback_t)( /* list of params */ )
void someAPIFunction( /*... */, callback_t callback, void *callback_param);
void standard_callback(void *param) {
((my_custom_callback_t) param) ( /* my params */ );
}
我考虑是否具有此类类型,将my_custom_callback作为参数传递给standard_callback是否正确?
void my_custom_callback(/* list of params */) { }
someAPIFunction( /*...*/, standard_callback, my_custom_callback);
不,您不能将函数指针作为传递void *
。
6.3.2.3指针
- 指向void的指针可以与任何对象类型的指针进行转换。指向任何对象类型的指针都可以转换为void指针,然后再返回;结果应等于原始指针。
和
- 可以将指向一种类型的函数的指针转换为指向另一种类型的函数的指针,然后再次返回。结果应等于原始指针。如果使用转换后的指针来调用其类型与引用的类型不兼容的函数,则该行为是不确定的。
注意,没有提到混合对象和函数指针的可能性。它似乎可以在某些系统上运行,但是它是未定义的行为,因此不能保证能正常工作。
但是,您可以创建包装对象并传递其地址:
struct wrapper {
my_custom_callback_t func;
};
struct wrapper my_wrapper = { my_custom_callback };
someAPIFunction( /*...*/, standard_callback, &my_wrapper);
或者只是将指针传递给函数指针(函数指针变量是对象类型):
my_custom_callback_t func = my_custom_callback;
someAPIFunction( /*...*/, standard_callback, &func);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句