host.cpp具有:

int main (void)
{
    void * th = dlopen("./p1.so", RTLD_LAZY);
    void * fu = dlsym(th, "fu");

    ((void(*)(int, const char*)) fu)(2, "rofl");

    return 0;
}

p1.cpp具有:
#include <iostream>

extern "C" bool fu (float * lol)
{
    std::cout << "fuuuuuuuu!!!\n";
    return true;
}

(我故意留下错误检查)

执行主机时,“fuuuuuuuu !!!”即使我使用完全不同的函数签名将空白指针强制转换为符号,也可以正确打印。

为什么会发生这种情况?不同的编译器之间的行为是否一致?

最佳答案

因为在void指针中没有有关函数签名的信息。或除地址外的任何信息。如果您开始使用参数,可能会遇到麻烦。

10-06 05:23
查看更多