我有一个类型为 void(*func)(int)
我得到了一个指向这个函数的指针,我怎么能确定一个指针真的是这个类型的呢?
if (typeof(pointer) == void(*func)(int)) {
//do something
}
这样做对吗?
编辑 -我从一个函数中得到指针作为参数,我想检查这个函数中指针的类型。
如果你是在动态地获取函数指针,那么可以尝试使用union to和标志变量来获取它的类型,而不需要检查一些复杂的东西。
#define type1 1
#define type2 2
union FN
{
void ....
int ....
....
}
typedef struct{
int type;
union FN fn;
} Function;
typeof
不是 C 标准的一部分。 它是GNU的一个扩展。
如果你想确定某个东西是特定类型,你可以在编译时用 _Generic
C11中引入的。
_Generic((pointer),
void(*)(int): /* insert your code here */,
)
如果所述指针不属于 void(*)(int)
,那么它将会编译失败。
如果你的函数得到了 指针 作为一个参数,并且有这个原型。
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
而不是作为函数参数的原始表达式的表达式。