【问题标题】:C/C++ casting void* to int ( * () ) (int,...);C/C++ 将 void* 转换为 int ( * () ) (int,...);
【发布时间】:2014-01-04 02:48:53
【问题描述】:

如何将void* 转换为int ( * () ) (int,...)

void* 来自dlsym。此代码未编译:

typedef  int ( *PSYS () ) (int,...);
PSYS getf =  (PSYS) dlsym(lib, "function" );

【问题讨论】:

  • 为什么要将void * 转换为其他类型?
  • @hacks 因为void*dlsym 返回的内容。
  • @PascalCuoq;它不应该隐式转换为那种类型吗? (对此了解不多)。
  • @hacks 1- 从 void* 到函数指针的转换在标准 C 中是未定义的,因此不会隐式发生。 2-即使从函数指针到函数指针的转换也不会在应用程序中隐式发生(我认为它们发生在将函数指针分配给函数指针左值时)。
  • “未编译”不是已知的错误消息。告诉我们你实际得到的那个。它可能与 typedef 中类型的语法有关,这看起来很荒谬。

标签: c++ c pointers function-pointers


【解决方案1】:

PSYS 是函数的类型,而不是指向函数的指针。你想要的

typedef  int ( *PSYS () ) (int,...);
PSYS* getf =  (PSYS*) dlsym(lib, "function" );

【讨论】:

  • Geat,编译工作,我现在只是害怕段错误^^。谢谢
  • @Ododo 大概它不会在那条线上出现段错误,而是在其他地方。祝您调试顺利。 :-)
【解决方案2】:

如果符号是函数指针,您的 typedef 可能是错误的。应该是:

typedef int (*PSYS)(int, ...);

【讨论】:

  • 不,其实是函数指针返回函数指针
  • 所以你想要得到的符号是一个返回函数指针的函数指针?如果是这样,那就太疯狂了。那么获取库中的其他函数是不是一个实用函数呢?
  • 不错,其他函数是内联的,无法导出,不过或许还有其他解决办法。
猜你喜欢
  • 2015-12-03
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
相关资源
最近更新 更多