Dladdr:指针到函数vs指针到对象
dladdr: pointer-to-function vs pointer-to-object
希望这是一个相当简单的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。投]/8(标准稿)
将函数指针转换为对象指针类型或反过来转换为对象指针类型是有条件支持的。这种转换的含义是由实现定义的,但如果实现支持双向转换,则将一种类型的右值转换为另一种类型,然后再转换回来,可能带有不同的cv限制,将产生原始指针值。
既然您已经依赖于提供dladdr
的c库扩展,那么您不妨依赖于允许您将函数指针强制转换为void*
的语言扩展。在这种情况下,您可能希望要求编译器不要通过编译不使用-Wpedantic
选项来警告使用语言扩展—或者使用至少有条件支持转换的标准版本。如果不支持转换,那么dladdr
也不支持。
相关文章:
- 为什么指针对象没有调用默认构造函数
- 如何访问双指针对象中的方法
- 如何使用智能指针对象执行成员函数指针
- 调用带有指针对象错误的指针变量
- 如何从模板类重载创建的指针对象上的运算符?
- C++指针对象的运算符重载
- 如何初始化数组指针对象
- 如何打印出唯一指针对象向量中的值(基于范围的循环)?C++
- C++指针对象差异
- 涉及继承,指针对象的交易以及何时进行的问题
- 表达式必须在C 中具有指针对象类型
- 下标需要数组或指针类型表达式必须具有指针对象类型
- 字符指针对象和相应的字符数组元素比较
- 如何在 c++ 中克隆为弱指针对象
- 指针对象使用CPP中的指针表达式进行比较
- Visual Studio中智能指针对象的自定义视图
- 使用指针 /对象 /模板参数正确构成
- 如果我确定只有一个线程一次处理指针/对象,则C/C 仍应使用同步
- 如何将值分配给指针对象 c++
- 更改智能指针对象,然后访问它