gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:00:11 25 4
gpt4 key购买 nike

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

有人可以帮我实现我想要的吗?不确定如何做。

最佳答案

void* 之间的转换通常是在指针上完成的。这意味着您可以将 resource_t* 转换为 void* 或从 void* 转换,但不能转换 resource_t (当然,您可以做一些事情很奇怪,比如将第一个 sizeof(void*) 字节解释为指针,但它实际上是 UB 并且一般不这样做)。

对于你的情况 - 这是:

extern resource_t res_ota_load_module

应该是一个指针:

extern resource_t* res_ota_load_module

然后如果

rest_activate_resource expects (resource_t *resource, char *path) as arguments

你可以这样做:

rest_activate_resource((resource_t*)res_ota_load_module, "OTA");

或者作为第二个选项:让 rest_activate_resourcevoid* resource 作为参数,然后在该函数内进行强制转换。

关于C:通过 void 指针然后强制转换实现平台独立性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42275410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com