首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针类型为“gpointer”的对象强制转换为不相关的类型“string*”

指针类型为“gpointer”的对象强制转换为不相关的类型“string*”
EN

Stack Overflow用户
提问于 2014-05-15 21:56:47
回答 2查看 1.4K关注 0票数 0

我正在尝试进行一些代码MISRA投诉,我有以下代码片段:

代码语言:javascript
复制
static void DBusCallback(GObject *object, GAsyncResult *res, gpointer user_data) {
    std::string * const tmp = reinterpret_cast<std::string*>(user_data);
    ...

其中DBusCallback是对call_DBus的回调:

代码语言:javascript
复制
   (void)call_DBus(proxy, NULL, &DBusCallback, reinterpret_cast<void*>(new std::string(user_data)));

//最后一个pram是回调中的user_data

它编译并运行正常,但在从gpointer进行字符串转换时出现以下MISRA警告: MISRA.CAST.PTR.UNRELATED :指针类型为'gpointer‘的对象转换为不相关的类型' string *’

规则是: MISRA-C++规则5-2-7 (必需):指针类型的对象不能直接或间接转换成不相关的指针类型。未指定5.2.10(7)原理从指针转换为不相关类型的结果未指定。

有什么办法可以避免这个警告吗?

EN

回答 2

Stack Overflow用户

发布于 2018-10-12 03:50:02

reinterpret_cast<>通常对MISRA不友好。

MISRA希望确保转换是可能的,并且此转换不会产生运行时错误。因此,你需要一个函数来以一种安全的方式执行转换,这可能会让你创建另一个类或函数来获取gpointer并返回一个字符串。

另一种选择(如果可能)是,在这个级别(离硬件很近),您可以禁用访问它的函数的reinterpret_cast<>警告。

最后一个是忘记std::string并使用const char*

代码语言:javascript
复制
static void DBusCallback(GObject *object, GAsyncResult *res, gpointer user_data) {
    std::string * const tmp = reinterpret_cast<std::string*>(user_data);

   (void)call_DBus(proxy, NULL, &DBusCallback, reinterpret_cast<const char*>(user_data));

顺便说一句,我假设你正在删除或管理std::string*的内存,如果不是这样,你就会缺乏内存。

票数 0
EN

Stack Overflow用户

发布于 2015-11-04 20:00:44

尝试在gpointer上使用static_cast而不是reinterpret_cast。我没有收到警告,在我的例子中,它是一个不同的类,而不是string,但我不认为这是相关的,如下所示:

代码语言:javascript
复制
std::string * tmp = static_cast<std::string *>(user_data);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23680400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档