C dl'的通用返回类型;ed函数

C dl'的通用返回类型;ed函数,c,dynamic-loading,C,Dynamic Loading,Hi Im动态加载函数并执行它们。我希望能够定义一个泛型返回类型,以便编译器能够正确地清理堆栈。目前它的打印乱七八糟的版本字符串 如何使以下代码正常工作 // gcc -o test test.c -ldl #include <stdio.h> #include <dlfcn.h> typedef union { int i; double d; float f; char *p;} anytype; int main() { anytype ver2;

Hi Im动态加载函数并执行它们。我希望能够定义一个泛型返回类型,以便编译器能够正确地清理堆栈。目前它的打印乱七八糟的版本字符串

如何使以下代码正常工作

// gcc -o test test.c -ldl

#include <stdio.h>
#include <dlfcn.h>

typedef union  { int i; double d; float f; char *p;} anytype; 

int main()
{
  anytype ver2;

  anytype (*f)();

    void *handle = dlopen("libz.so.1", RTLD_NOW|RTLD_GLOBAL);
    f = dlsym(handle,"zlibVersion");
    //const char * zlibVersion (void);
    ver2=f();
    printf("zlib version %s\n", ver2.p);
    dlclose(handle);

    return 0;
}
//gcc-o test.c-ldl
#包括
#包括
typedef并集{int i;double d;float f;char*p;}anytype;
int main()
{
任何类型ver2;
任意类型(*f)();
void*handle=dlopen(“libz.so.1”,RTLD_NOW | RTLD_GLOBAL);
f=dlsym(手柄,“zlibVersion”);
//常量字符*zlibVersion(无效);
ver2=f();
printf(“zlib版本%s\n”,版本2.p);
dlclose(手柄);
返回0;
}

不幸的是,不能使用
联合
替换未知类型的返回值。在具有浮点寄存器的体系结构上,浮点返回值在浮点寄存器中返回,而整数或指针返回值在通用寄存器中返回。通常,如果返回值是union或struct,则调用方必须提供第一个参数,该参数指向被调用方将用返回值填充的存储区域(大小正确)。(有很多变化。它完全依赖于平台ABI;我描述的是i386 ABI的一部分。)


因此,您确实需要知道函数的签名才能调用它。

使用与被调用函数完全匹配的函数指针类型。在这种情况下,将
f
定义为
const char*(*f)(void)
。虽然您的代码应该按原样工作,但没有理由像您这样做。@nm当然有原因!这就是Visual C编辑和继续的工作方式。我确信Visual C编辑和继续与
dlopen
RTLD_GOLBAL
没有任何关系。即使VisualC++中的一些代码类似于你所写的,对于任何在这个环境之外的程序,也可能是那些在它里面工作的人来说,这绝对是没有意义的。