C 向函数指针强制转换long?

C 向函数指针强制转换long?,c,function-pointers,c89,C,Function Pointers,C89,我有以下代码: long fp = ... void (*ptr)(long, char*, char*) = fp; longfp是一个正确的函数指针,它以long形式出现。我得到了标准的“从int生成指针而不使用强制转换”警告。我希望能够使用以下工具进行编译: -std=iso9899:1990 -pedantic-errors 这就把警告变成了错误。问题是:正确的演员阵容是什么?我尝试过各种猜测,例如: void (*ptr)(long, char*, char*) = (void)(

我有以下代码:

long fp = ...
void (*ptr)(long, char*, char*) = fp;
long
fp
是一个正确的函数指针,它以long形式出现。我得到了标准的“从int生成指针而不使用强制转换”警告。我希望能够使用以下工具进行编译:

-std=iso9899:1990 -pedantic-errors
这就把警告变成了错误。问题是:正确的演员阵容是什么?我尝试过各种猜测,例如:

void (*ptr)(long, char*, char*) = (void)(*)(long, char*, char*) fp;
但似乎找不到合适的演员。

正确的演员阵容是:

显然,这可以用合适的typedef来处理


但无论哪种方式,其结果都是实现定义的。如果可以,请避免这种情况,并将指针保持为指针类型。下一个最好的方法是使用
intptr\t
,如果它可用的话。

可能是这样的:

void (* ptr)(long, char, char *) = (void (*)(long, char, char *))fp;
但我的建议是使用
typedef
并忘记所有这些混乱:

typedef void (* fnPtr)(long, char, char*);
fnPtr ptr = (fnPtr) fp;
唯一“正确”的方法根本不是强制转换,而是复制二进制表示:

long fp;
void (*ptr)(long, char*, char*);

memcpy(&ptr, &fp, sizeof ptr);

这里的主要问题是,尽管有无数的C-API依赖于此功能,但ANSI-C不允许这样做。因此,使用
-pedantic
进行编译时可能会遇到麻烦。 正如其他海报所暗示的,你可以通过使用
memcpy()
或联合类型来欺骗演员


顺便说一句,POSIX保证这会起作用,所以关于“实现定义的结果”的部分就不那么可怕了。

为什么要这样做?在整数和函数指针之间转换?如果
fp
是一个正确的函数指针,它怎么会被存储在一个长字符串中?也许你应该把注意力集中在获得正确的输入上,而不是在事后想一个乱七八糟的问题。我希望你能回答演员的问题,而不是重新设计。JNI带来了许多罪恶,其中这是最少的。@Lister先生:有时候它并不依赖于你。在Windows编程中,通常的做法是在wndproc的参数内传递任何类型的指针,这些参数保证足够大,可以满足这些要求。可能OP使用的是这样一个库。C99明确允许这样做,它只是声明结果是实现定义的。酷,我不知道。我主要是C++的人,所以我更熟悉C89,它不允许它。sizeof(ptr)。
long fp;
void (*ptr)(long, char*, char*);

memcpy(&ptr, &fp, sizeof ptr);