被调用对象不是函数或函数指针

标签 c linux gcc x86-64 glibc

我有以下代码。

typedef pid_t (*getpidType)(void);

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

编译器提示调用的对象“f”不是函数。这里发生了什么?我没有以正确的方式声明和使用函数指针 f 吗?

最佳答案

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

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

(更好的是,也删除显式转换:

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

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

关于被调用对象不是函数或函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10702723/

相关文章:

c++ - 哪些 C 功能受 C++ 功能影响/源自 C++ 功能?

C 取消引用数组指针?

c - 为什么这个简单的代码带有 printf "freeze"?

php - UTF-8贯穿始终

android - __attribute__((used)) 在将静态库链接到共享对象时无效(android gcc 4.8)

c - 非敏感信息的TCP客户端请求/服务器响应的安全考虑

linux - 检查 Linux 上是否启用了写入缓存

linux - 什么存储在线程的堆栈中?

c++ - mingw32-make 使用 g++ 而不是 cc 或 gcc 来编译 .c 源文件

c - 警告 : format ‘%s’ expects type ‘char *’ , 但参数 2 的类型为 ‘int’