【问题标题】:Called object is not a function or a function pointer被调用对象不是函数或函数指针
【发布时间】:2012-05-28 23:38:15
【问题描述】:

我有以下代码。

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吗?

【问题讨论】:

    标签: c linux gcc x86-64 glibc


    【解决方案1】:

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

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

    (更好的是,也放弃显式转换:

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

    由于dlsym 返回void* 并且void* 可以隐式转换为任何其他指针类型,因此不需要强制转换。它甚至可能隐藏错误。)

    【讨论】:

    • 是的,你是对的 void* 可以转换为 C 中的任何类型,但不能转换为 C++,所以为了便于移植,我保留它。
    • @user1018562,当你用 C 写的时候,用 C 写!不存在便携性问题。您可以将 C 编译和 C++ 编译的文件链接在一起。
    • @user1018562:这只是当你想用 C 和 C++ 的子集编写时才会出现的问题,这本身就是一种艺术形式,需要对两种语言都有深入的了解。 Shahbaz 是对的,链接时的兼容性更容易建立。
    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 2015-05-21
    • 2022-10-19
    • 2012-06-22
    相关资源
    最近更新 更多