具有未确定参数的函数指针

时间:2012-07-19 14:17:56

标签: c function-pointers

我想要一个可以采用各种类型参数的函数指针。我该怎么做?

以下示例(第1行),我希望void (*fp)(int)也可以使用void (*fp)(char*)。下面的代码没有正确编译,因为我传递char *,其中int是预期的,因此编译以下代码会给你警告(并且将无法正常工作)。

void callIt(void (*fp)(int))
{
    (*fp)(5);
}

void intPrint(int x)
{
    printf("%d\n", x);
}

void stringPrint(char *s)
{
    printf("%s\n", s);
}

int main()
{
    void (*fp1)(int) = intPrint;
    callIt(fp1);
    void (*fp2)(char*) = stringPrint;
    callIt(fp2);
    return 0;
}

注意:我知道尝试将整数5作为char *参数传递是愚蠢的,但这不是这个问题的关注点。如果需要,可以用浮点数替换char *。

4 个答案:

答案 0 :(得分:3)

我会说使用void (*fp)(void*),然后将指针传递给你的变量并将它们转换为void *。它非常hacky,但它应该可以工作。

例如:

void callIt(void (*fp)(void*))
{
    int x = 5;
    (*fp)((void*)&x);
}

答案 1 :(得分:1)

您期望对stringPrint的调用完全正确吗?

看起来如果你确实这样做了,它最终会尝试将内存位置5的内容打印为字符串。我怀疑这不是你想要的,因为它会崩溃,我怀疑你打算输出'5'。

另请注意......至少需要一个命名参数。传递空白*和滥用数量的投射至少会编译。

答案 2 :(得分:1)

虽然不好,但函数指针的类型并不重要。

将其定义为

typedef void (*fp_t)(void * pv);

您唯一需要确定的是,您调用它的方式与您指定的功能相匹配。

int intFuncWithTwoDoubles(double d1, double d2);
char * pCharFuncWithIntAndPointer(int i, void * pv);

...

fp_t fp = NULL;

fp = intFuncWithTwoDoubles;
printf("%d", fp(0.0, 1.0));

fp = pCharFuncWithIntAndPointer;
printf("%s", fp(1, NULL));

...

答案 3 :(得分:0)

为什么不将它作为接受void *参数的函数指针?

void(*fp)(void*) 

这将处理所有可能的指针参数。现在对于数据类型,您可以为每个函数指针类型创建一个函数指针类型,或仅为将要与函数指针一起使用的函数,将数据类型作为指针传递,并在函数的开头取消引用它们。这只是一个想法,却不知道你想要做什么。