我已经读过将函数指针转换为数据指针,反之亦然,但在大多数平台上都可以工作,但不能保证工作.为什么会这样?两者都不应该只是简单地址到主存储器中,因此兼容吗?
如何声明一个可以安全指向任何函数的函数指针?
我需要类似void指针的东西,但需要功能.我想过简单地使用它,但根据这个问题的答案,函数指针不能可靠地转换为数据指针,至少在非POSIX系统上.
我搜索并找到了一些可能的例子:
Windows有FARPROC:
int (FAR WINAPI * FARPROC) ()
Run Code Online (Sandbox Code Playgroud)
文档还提到了这一点:
在C中,FARPROC声明指示具有未指定参数列表的回调函数.
听起来不错,但回报值呢?它明确指定为int.
typedef void (*GLfunction)();
extern GLfunction glXGetProcAddressARB(const GLubyte *procName);
Run Code Online (Sandbox Code Playgroud)
参数列表也未指定,但返回类型明确指定为void.
我不知道如何解释这一点.在使用之前,函数指针将使用适当的原型强制转换为函数指针类型.例如:
typedef void (*function_pointer_t)();
extern function_pointer_t get_function(const char * name);
/* Somewhere else... */
typedef double (*cosine_function_t)(double);
cosine_function_t cosine = (cosine_function_t) get_function("cos");
Run Code Online (Sandbox Code Playgroud)
这段代码安全吗?它是否违反任何C标准或导致任何未定义的行为?