gpt4 book ai didi

c - C 中这些函数指针之间的转换安全吗?

转载 作者:行者123 更新时间:2023-11-30 15:24:53 25 4
gpt4 key购买 nike

voidargchararg之间或者在voidargfooarg之间转换是否安全?:

typedef int (*voidarg)(void *);
typedef int (*chararg)(char *);
typedef int (*fooarg)(foo_t *);

或者在voidretcharret之间或者在voidretfooret之间?:

typedef void *(*voidret)(int);
typedef char *(*charret)(int);
typedef foo_t *(*fooret)(int);

我知道这在 C++ 中可能不安全(特别是对于未知的 foo_t 类型),但是根据任何 C 标准或主要 C 编译器,它安全吗?

编辑:

我忘了提一个重要的点。我也想调用这些函数,即能够执行此操作:

int charfunc(char *s) { /* ... */ }
char str[] = "...";

int somefunction(voidarg f, void *data)
{
return f(data);
}

int main()
{
int i = somefunction(charfunc, str);
}

最佳答案

我希望转换是安全的,前提是在调用之前将指针转换为正确的类型。这还假设它们都使用相同的调用约定装饰进行声明。

我已经做到了here在我的运算符构造函数中,它以“通用”形式存储各种函数类型,但它们在运算符执行函数中被转换为正确的类型。这似乎可以与 Cygwin/mingw/Ubuntu 中的 gcc、solaris 中的 suncc 以及 Visual Studio 一起使用。我的替代方案是非原型(prototype)函数指针,它给我带来了大量嘈杂的编译器警告。

<小时/>

对于更新,不,至少从可移植性的角度来看,这对我来说并不安全。通过错误类型的指针调用函数是未定义的行为。 void * 类型能够存储指向任何对象类型的指针(不一定是函数,但这不是这里的问题)。函数指针能够存储不同签名的函数指针,但通过错误的类型调用可能实现类似“reinterpret_cast”的效果,否则可能会崩溃。

关于c - C 中这些函数指针之间的转换安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28175891/

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