希望这是一个简单的C++问题(而不是语言律师问题)。

应该如何在C++中使用GNU扩展dladdr?通常,人们会用C语言编写以下代码:

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <dlfcn.h>

static void where_am_i() {}

int main()
{
  Dl_info info;
  dladdr( (void*)&where_am_i, &info );

  return 0;
}

但是使用clang可以看到强制转换可能是无效的:
$ clang --version
Debian clang version 3.6.2-3 (tags/RELEASE_362/final) (based on LLVM 3.6.2)
Target: x86_64-pc-linux-gnu
Thread model: posix
$ clang -Wpedantic -o foo foo.cpp -ldl
foo.cpp:11:11: warning: cast between pointer-to-function and pointer-to-object is an extension [-Wpedantic]
  dladdr( (void*)&where_am_i, &info );
          ^~~~~~~~~~~~~~~~~~
1 warning generated.

该警告对我来说似乎合情合理,因此有办法解决此问题吗?

最佳答案

没有将函数指针可移植地转换为void*的标准方法。因此,没有标准的方法可移植地使用dladdr。在C++ 11之前,这种转换是不正确的(我没有可用的文档,但是clang的警告建议这样做)。但是从C++ 11开始,有条件地支持该转换:

[expr.reinterpret.cast]/8(标准草案)



由于您已经依赖于提供dladdr的c库扩展,因此您可能还依赖于允许将函数指针转换为void*的语言扩展。在这种情况下,您可能希望让编译器不要通过不带-Wpedantic选项的编译来警告您不要使用语言扩展名-或使用至少有条件支持转换的标准版本。如果不支持该转换,那么dladdr也不支持。

关于c++ - dladdr : pointer-to-function vs pointer-to-object,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39508272/

10-09 02:22