强制转换为函数指针?

gub*_*bby 4 c function-pointers c89

我有以下代码:

long fp = ...
void (*ptr)(long, char*, char*) = fp;
Run Code Online (Sandbox Code Playgroud)

long fp是一个正确的函数指针,它以长整数形式出现.我正在获得标准"从没有强制转换的int生成指针"警告.我希望能够编译:

-std=iso9899:1990 -pedantic-errors
Run Code Online (Sandbox Code Playgroud)

这会将警告变成错误.问题是:什么是正确的演员?我尝试了各种猜测,例如:

void (*ptr)(long, char*, char*) = (void)(*)(long, char*, char*) fp;
Run Code Online (Sandbox Code Playgroud)

但似乎无法找到合适的人选.

Oli*_*rth 7

"正确"的演员是:

void (*ptr)(long, char*, char*) = (void (*)(long, char*, char*))fp;
Run Code Online (Sandbox Code Playgroud)

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

但无论哪种方式,其结果都是实现定义的.如果可以,请避免这种情况,并将指针保持在指针类型中.接下来最好的事情是使用intptr_t它是否可用.


Mat*_*lia 7

可能它是这样的:

void (* ptr)(long, char, char *) = (void (*)(long, char, char *))fp;
Run Code Online (Sandbox Code Playgroud)

但我的建议是使用a typedef而忘记所有这些混乱:

typedef void (* fnPtr)(long, char, char*);
fnPtr ptr = (fnPtr) fp;
Run Code Online (Sandbox Code Playgroud)