2013-04-04 114 views
21

碰到下面显示的代码行 我认为它可能是一个函数指针的转换,返回void和一个void指针,是否正确?强制转换为函数指针?

(void (*)(void *))SGENT_1_calc 
+0

投SGENT_1_calc为指针,以原无效funcname的(无效*)函数(指向void)返回void – 2013-04-04 09:28:22

回答

29

是的,这是正确的。我觉得不是很可读,所以我建议声明必须指出函数的签名:

typedef void sigrout_t(void*); 

我也有编码约定rout_t结束的类型是这样的类型的函数签名。否则,可能会将其命名为,因为_t是一个后缀reserved Posix的

后者对我铸件,也许这样称呼它

((sigrout_t*) SGENT_1_calc) (someptr); 
+1

Upvoted for typedef,我完全同意。 – Joe 2013-04-04 09:45:54

+0

一方面,typedef消除了冗余和混淆(至少对一些)括号的必要性。另一方面,它降低了立即确定演员的能力。如果你想知道演员是一个函数指针,你必须查找sigrout_t被定义为... +1来提供替代。 – Sebivor 2013-04-04 09:59:59

+0

以_t结尾的名字是为POSIX保留的,请参阅http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html – satur9nine 2015-02-09 17:13:09

0

是的,这是一个演员,你已经说过。

4

是的,功能应该寻找这样

void func(void*); 

但是这个陈述缺少一个目标,因为一个投射到什么都没有用。因此,它应该像

func = (void (*)(void *))SGENT_1_calc; 
0

是它的一个函数指针,你可以分配给功能与 这里SGENT_1_calc可以直接分配给funcname的