希望这是一个简单的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/