2017-09-24 523 views
4

我有一个数组,看起来像这样:void *的函数指针数组转换

void* functions[]; // pointer to functions, each function returns an int and has int parameters A and B 

我想丢在下面这段:

int (*F)(int a, int b) = ((CAST HERE) functions)[0]; 
int result = F(a, b); 

我已经尝试过“(INT( *)(int,int))“作为转换,但编译器抱怨我试图使用函数指针作为数组。

+0

编译器是正确的。检查你的括号。 (0); –

+1

可以尝试:'int(* F)(int,int)=(int(*)(int,int))functions [0];' – 4386427

+1

使用typedef ... –

回答

0

function是指向void类型数据的指针数组。你想把它转换为指针,以int (*)(int, int)类型的指针,这将是int (**)(int, int),所以下面的工作:

int (*F)(int, int) = ((int (**)(int, int)) functions)[0]; 

正如指出的@M.M,上面会导致未定义行为。你可能想阅读this文章和this以了解更多。


理想情况下,你会做这样的事情:

// Array of 2 pointers to functions that return int and takes 2 ints 
int (*functions[2])(int, int) = {&foo, &bar}; 

// a pointer to function 
int (*F)(int, int) = functions[0]; 
int r = F(3, 4); 
+1

这会导致未定义的行为 –

+0

我测试了这个,它似乎适用于我的应用程序,谢谢! – Jas

+0

@Jas - 未定义的行为并不意味着“没有工作”。它可能“似乎长时间工作”,直到在移动到新的平台时没有明显的原因。那时你已经忘了这篇文章,不得不加班加点弄清楚你搞砸了。 – StoryTeller

4

这将有助于使用typedef为函数类型:

typedef int F_type(int, int); 

然后,你可以写:

F_type *F = (F_type *)(functions[0]); 

这将是不确定的行为(严格别名冲突),试图投functions到使用索引操作符之前的其他东西。

请注意,标准C不支持将void *转换为函数指针。如果可能的话,使数组是摆在首位的函数指针:

F_type *functions[] = { &func1, &func2 }; 

NB。有些人更喜欢使用typedef作为函数指针类型,而不是函数类型。我认为它会提供更多可读代码来避免指针typedef,但是我提到了这一点,以便您了解其他建议。

+0

好的答案,但我担心OP不想要'typedef'。 – gsamaras

+0

@gsamaras当然。我低估了你的答案,因为它会导致未定义的行为。另外你声称OP的基础是什么不想要typedef? –

+0

真的吗?嗯,我不确定为什么,你能解释一下吗?我可能是错的,因为nm告诉OP关于typedef,然后OP回答我不能这样做,但他回答了mm ..对不起! – gsamaras

2

(int (**)(int, int))铸造似乎现在做的伎俩,但它调用未定义行为

转换void*起作用指针不是标准C.

注意,混叠void*到不同类型的;严格的锯齿违规。更多详情,请参阅What is the effect of casting a function pointer void?

请考虑从头开始使用函数指针数组。

+2

别名和转换是不同的事情。别名不兼容的类型违反严格的别名规则,它不会调用转换。例如,比较'double d [2] = {5.0,6.0}; int x = d [0];'(转换)与'int y =((int *)&d)[0];'(混叠) –