我认为我应该如何void *正确使用(我有一些C语言的突破).我记得void *用于启用任何参数传递给回调函数.我知道可以传递类似原始类型int *,const char *或甚至值集合的东西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 */ );
}
Run Code Online (Sandbox Code Playgroud)
我考虑是否有这样的类型将my_custom_callback作为param传递给standard_callback是正确的吗?
void my_custom_callback(/* list of params */) { }
someAPIFunction( /*...*/, standard_callback, my_custom_callback);
Run Code Online (Sandbox Code Playgroud)
不,你不能将函数指针传递为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);
Run Code Online (Sandbox Code Playgroud)
或者只是将指针传递给函数指针(函数指针变量是对象类型):
my_custom_callback_t func = my_custom_callback;
someAPIFunction( /*...*/, standard_callback, &func);
Run Code Online (Sandbox Code Playgroud)