使用未知数量的参数通过引用调用函数

时间:2015-01-04 14:28:32

标签: c pointers function-pointers

为了通过一个名字来调用一个函数,我已经提出了这段代码。这当前有效,但我不确定它是否是未定义的行为。任何人都可以对此有所了解,也许可以帮助我找到更好的解决方案。

#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;
}

2 个答案:

答案 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}}。