如何声明可以安全地指向任何函数的函数指针?
我需要void
指针之类的东西,但对于函数。我想过简单地使用它,但是根据这个问题的答案,函数指针不能可靠地转换为数据指针,至少在非 POSIX 系统上是这样。
我搜索并找到了一些可能的例子:
Windows 有FARPROC:
int (FAR WINAPI * FARPROC) ()
该文档还提到了这一点:
在 C 中,FARPROC 声明表示具有未指定参数列表的回调函数。
听起来不错,但是返回值呢?它明确指定为
int
。OpenGL 的规范之一具有:
typedef void (*GLfunction)(); extern GLfunction glXGetProcAddressARB(const GLubyte *procName);
参数列表也未指定,但返回类型明确指定为
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");
这段代码安全吗?它是否违反任何 C 标准或导致任何未定义的行为?