我正在尝试做一些事情以获得平台独立性。 我有一个文件“class_loader.h”,其中有
extern void* res_ota_load_module;
对于特定于样本的平台,通常将其定义为
extern resource_t res_ota_load_module
将resource_t定义为(在另一个文件中):
struct resource_s {
struct resource_s *next; /* for LIST, points to next resource defined */
const char *url; /*handled URL */
rest_resource_flags_t flags; /* handled RESTful methods */
const char *attributes; /* link-format attributes */
restful_handler get_handler; /* handler function */
restful_handler post_handler; /* handler function */
restful_handler put_handler; /* handler function */
restful_handler delete_handler; /* handler function */
union {
struct periodic_resource_s *periodic; /* special data depending on flags */
restful_trigger_handler trigger;
restful_trigger_handler resume;
};
};
typedef struct resource_s resource_t;
但我想保持平台独立。
我现在要做的是,在新文件中,“main_upnp.c”执行以下操作:
rest_activate_resource(&((resource_t)res_ota_load_module), "OTA");
其中rest_activate_resource期望“(resource_t * resource,char * path)”作为参数。 上面的代码虽然给出了以下错误:
../../uJ/main_upnp.c: In function ‘process_thread_uj_process’:
../../uJ/main_upnp.c:257:2: error: conversion to non-scalar type requested
rest_activate_resource(&((resource_t)res_ota_load_module), "OTA");
任何人都可以帮我实现我的目标吗?不确定如何做到这一点。
答案 0 :(得分:1)
void*
的转换通常是在指针上完成的。这意味着您可以将resource_t*
投放到void*
,但不能投放resource_t
(您的可以做一些奇怪的事情,例如先解释sizeof(void*)
个字节作为一个指针,但它实际上是UB,一般不这样做。)
至于你的情况 - 这个:
extern resource_t res_ota_load_module
应该是一个指针:
extern resource_t* res_ota_load_module
然后如果
rest_activate_resource
期望(resource_t *resource, char *path)
作为参数
你可以这样做:
rest_activate_resource((resource_t*)res_ota_load_module, "OTA");
或者作为第二个选项:让rest_activate_resource
将void* resource
作为参数,然后在该函数内部进行转换。