【问题标题】:Pointer returning void working in C but not in C++指针返回 void 在 C 中工作但不在 C++ 中
【发布时间】:2021-03-14 20:22:05
【问题描述】:

我正在尝试为 Tizen 平台制作本机 C/C++ 应用程序,这是 Tizen Studio 提供的模板代码的一部分: (注意这是C代码)

static char*
gl_text_get(void *data, Evas_Object *obj, const char *part)
{
    char buf[1024];
    item_data *id = data;
    int index = id->index;

    if (index == 0)
        snprintf(buf, 1023, "%s", "Email Inbox");
    else if (index == 1)
        snprintf(buf, 1023, "%s", "circle@tizen.com");
    else if (!strcmp(part, "elm.text"))
        snprintf(buf, 1023, "%s", genlist_demo_names[index - 2]);
    else if (!strcmp(part, "elm.text.1"))
        snprintf(buf, 1023, "%s", "Re: Long time no see");
    else
        snprintf(buf, 1023, "%s", "Hello~! how have you been?");

    return strdup(buf);
}

static void
gl_del(void *data, Evas_Object *obj)
{
    item_data *id = data;
    if (id) free(id);
}

static void
gl_selected_cb(void *data, Evas_Object *obj, void *event_info)
{
    Evas_Object *label;
    Elm_Object_Item *it = event_info;
    appdata_s *ad = data;
    elm_genlist_item_selected_set(it, EINA_FALSE);

    label = create_label(ad, it);
    //View changed to text detail view.
    elm_naviframe_item_push(ad->nf, elm_object_item_part_text_get(it, "elm.text"), NULL, NULL, label, NULL);

    return;
}

这个模板成功编译并在我的 Tizen 设备上运行。但是,当我在 C++ 文件中复制相同的代码时(因为我的项目中需要一些仅限 cpp 的功能)。编译失败:

这对我来说似乎很明显,因为指针无法获取void 的值。那么为什么这在 C 代码中工作? void 在 C 和 C++ 中的含义相同吗?

【问题讨论】:

  • C 和 C++ 是不同的语言......有点像你要求"biscuit" in UK/USA
  • 当然,但他们有共同点
  • 嗯,C 和 C++ 对 void* 的处理方式不同......除此之外还有很多其他的事情

标签: c++ c tizen-native-app


【解决方案1】:

在 C 和 C++ 中,任何指针类型都可以隐式转换为 void*

但仅在 C 中,void* 可以隐式转换为任何其他指针类型,而在 C++ 中并非如此,您需要显式类型转换,例如:

Elm_Object_Item *it = (Elm_Object_Item *) event_info;
appdata_s *ad = (appdata_s *) data;
item_data *id = (item_data *) calloc(sizeof(item_data), 1);

或者,更优选地,使用static_cast 而不是C-style cast

Elm_Object_Item *it = static_cast<Elm_Object_Item*>(event_info);
appdata_s *ad = static_cast<appdata_s*>(data);
item_data *id = static_cast<item_data*>(calloc(sizeof(item_data), 1));

【讨论】:

  • 谢谢!它工作得很好。我用 Java 编写代码,所以对我来说 Elm_Object_Item *it = (Elm_Object_Item *) event_info; 是一个更清晰的语法。使用static_cast&lt;Elm_Object_Item*&gt;(event_info); 有什么真正的优势吗?
  • 您保证您了解您正在投射的内容。 C 风格转换可以表示 static_castconst_castreinterpret_cast 的任意组合。
猜你喜欢
  • 1970-01-01
  • 2012-02-26
  • 2014-08-16
  • 1970-01-01
  • 2013-11-29
  • 2021-12-24
  • 2013-07-09
  • 2017-09-10
  • 1970-01-01
相关资源
最近更新 更多