返回 void 的指针在 C 中有效,但在 C++ 中无效
Pointer returning void working in C but not in C++
我正在尝试为 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++ 中,任何指针类型都可以隐式转换为 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
instead of a 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));
我正在尝试为 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++ 中,任何指针类型都可以隐式转换为 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
instead of a 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));