2012-05-22 52 views
3

我有以下代码。被调用的对象不是函数或函数指针

typedef pid_t (*getpidType)(void); 

pid_t getpid(void) 
{ 
    printf("Hello, getpid!\n"); 
    getpidType* f = (getpidType*)dlsym(RTLD_NEXT, "getpid"); 
    return f(); // <-- Problem here 
} 

编译器抱怨called object ‘f’ is not a function。这里发生了什么?我没有以正确的方式声明和使用函数指针f

回答

9

getpidType已经是一个指针,所以降*

getpidType f = (getpidType)dlsym(RTLD_NEXT, "getpid"); 

(更妙的是,删除显式转换,以及:

getpidType f = dlsym(RTLD_NEXT, "getpid"); 

由于dlsym回报void*void*隐式转换为任何其他指针类型,不需要投射,它甚至可能隐藏错误。)

+0

是的你是正确的无效*可以转换为C中的任何类型,但不是在C++中,因此为了便于携带,我保留它。 – pythonic

+0

@ user1018562,当你用C编写时,用C写!没有可移植性问题。您可以将C编译文件和C++编译文件链接在一起。 – Shahbaz

+0

@ user1018562:当您想要编写C和C++的子集时,这只是一个问题,C和C++本身就是一种艺术形式,需要熟悉这两种语言。 Shahbaz是对的,在链接时兼容性要容易得多。 –

相关问题