gpt4 book ai didi

c - 指向任何函数的指针?

转载 作者:太空狗 更新时间:2023-10-29 17:00:25 25 4
gpt4 key购买 nike

如何声明一个可以安全指向任何函数的函数指针?

我需要类似void 指针的东西,但用于函数。我考虑过简单地使用它,但是,根据 this question 的答案, 函数指针不能可靠地转换为数据指针,至少在非 POSIX 系统上是这样。

我搜索并找到了一些可能的例子:

  • Windows 有 FARPROC :

    int (FAR WINAPI * FARPROC) ()

    文档还提到了这一点:

    In C, the FARPROC declaration indicates a callback function that has an unspecified parameter list.

    听起来不错,但是返回值呢?它明确指定为 int

  • One of OpenGL's specifications有:

    typedef void (*GLfunction)();
    extern GLfunction glXGetProcAddressARB(const GLubyte *procName);

    同样未指定参数列表,但返回类型明确指定为void

我不确定如何解释这个。在使用之前,函数指针将被转换为具有适当原型(prototype)的函数指针类型。例如:

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 标准或导致任何未定义的行为?

最佳答案

首先,没有办法声明一个函数指针可以接受任何函数指针类型而无需强制转换。正如您自己已经注意到的那样,问题在于任何函数指针声明都会立即采用特定的返回类型。因此,函数指针世界中不存在完全模拟 void * 的东西。

其次,任何函数指针都可以用来存储任何其他函数指针值,只要您使用显式强制转换 强制转换。当然,为了通过强制转换为不同类型的指针执行正确的调用,您需要将其转换回原始类型。 IE。只要在调用时恢复了正确的函数指针类型,这就不会导致任何未定义的行为。

在您的示例中,如果 get_function 返回的指针确实指向 double (double) 类型的函数,那么通过 调用该函数是绝对安全的>余弦指针。指针值中间存储在 void (*)() 指针中这一事实不会破坏它。

第三,在C语言中,()参数声明代表未指定数量和类型的参数。这是朝着“通用”函数指针类型方向迈出的一步,无需强制转换即可使用(只要您在调用中提供正确的参数并且只要返回类型匹配)

void foo(void);
void bar(int i);
void baz(long i, double x);

int main() {
void (*a[3])() = { foo, bar, baz };
a[0]();
a[1](42);
a[2](5L, 3.1415);
}

但是,同样,返回类型的问题仍然存在。

关于c - 指向任何函数的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12763052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com