在C语言中,如何知道一个变量是否是函数指针?

问题描述 投票:2回答:3

我有一个类型为 void(*func)(int) 我得到了一个指向这个函数的指针,我怎么能确定一个指针真的是这个类型的呢?

if (typeof(pointer) == void(*func)(int)) {
    //do something     
} 

这样做对吗?

编辑 -我从一个函数中得到指针作为参数,我想检查这个函数中指针的类型。

c pointers void-pointers typeof
3个回答
4
投票

如果你是在动态地获取函数指针,那么可以尝试使用union to和一个标志变量来获取它的类型,而不用检查一些复杂的东西。

#define type1 1
#define type2 2
union FN
{
void ....
int ....
....
}

typedef struct{
int type;

union FN fn;
} Function;

3
投票

typeof 不是 C 标准的一部分。 它是GNU的一个扩展。

如果你想确定某个东西是特定类型,你可以在编译时用 _Generic C11中引入的。

_Generic((pointer), 
    void(*)(int): /* insert your code here */,
)

如果所述指针不属于 void(*)(int),那么它将会编译失败。


3
投票

如果你的函数得到了 指针 作为一个参数,并且有这个原型。

void my_function(void (*func)(int)) {
    // How can I test if `func` really points to a function taking an `int`?
}

那么你在这个函数的体内就没有什么可以做的了。my_function 以验证 func 真正的指向。

  • 你可以测试它是否是一个空指针。

    if (!func) { /* NULL was passed */ }
    
  • 你可以测试它是否指向一个已知的函数。

    if (func == exit) { /* haha! (*func)(1) will abort */ }
    
  • 除了以上这些,我们不可能知道到底传递给 my_function注:它可以是一个具有正确原型的实际函数,也可以是另一个隐式或显式投向预期类型的函数,甚至是其他一些带有投向的标量对象。

如果你想写一个宏,其扩展取决于表达式的类型,你可以使用新的C11的 _Generic 构。

#define IS_VOID_FUNC_OF_INT(func)  _Generic(func, void(*)(int): 1, default: 0)

但在功能主体内使用这个 my_function 以上将始终评价为 1:只有定义的类型 func 经测试 _Generic而不是作为函数参数的原始表达式的表达式。

© www.soinside.com 2019 - 2024. All rights reserved.