为了通过一个名字来调用一个函数,我已经提出了这段代码。这当前有效,但我不确定它是否是未定义的行为。任何人都可以对此有所了解,也许可以帮助我找到更好的解决方案。
#include <stdio.h>
typedef void (*FunctionCallback)();
void first(char *str);
void second(int , int);
FunctionCallback function[] = {&first, &second};
void first(char *str )
{
printf( "First: %s\n", str );
}
void second(int x, int y)
{
int answer;
answer = x +y;
printf("Second: %d\n", answer);
}
int main()
{
function[0]("Working");
function[1](6, 5);
return 0;
}
答案 0 :(得分:1)
如果你小心的话,这应该没问题。我认为UB可能仅在first
的情况下,期望char*
,但是已经传递const char*
。也许在某些平台上,编译器将const char*
内容放入某些奇怪的地方,而可写内存的处理方式也不同。但这是异国情调,是假设的。
无论如何,要明确,在C:
typedef void (*FunctionCallback)();
是一种指向没有参数列表的函数的指针。所以它是兼容的,正如mafso说的那样。
typedef void (*FunctionCallback)(void);
意味着指向期望零参数的函数的指针。这只与零参数的其他函数兼容。 (注意它与C ++不同,其中fun()
与C中的fun(void)
相同
编辑:
我会更多地强调,每次都需要正确的论证。同时,编译器无法帮助你,所以,嗯,祝你好运。
我可以想象一个想要聪明的编译器看到你永远不会存储任何fun(const char*)
的地址,并使用它来优化你的代码,从而删除对first
的调用。 / p>
答案 1 :(得分:0)
代码有效,但使用旧式声明,这些声明在C89中已标记为过时。用于调用函数的函数指针和调用的函数必须是兼容类型,并且传递的参数类型必须与定义的类型匹配。对于显示的代码,两者都是如此。
请注意,此技术不适用于可变参数函数或函数,其参数不是“自我推销”,例如类型short
或{ {1}}。