C:通过void指针然后转换平台独立性

时间:2017-02-16 13:31:12

标签: c pointers casting

我正在尝试做一些事情以获得平台独立性。 我有一个文件“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");

任何人都可以帮我实现我的目标吗?不确定如何做到这一点。

1 个答案:

答案 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_resourcevoid* resource作为参数,然后在该函数内部进行转换。