gpt4 book ai didi

c - 使用右指针类型,不想用 void * 进行转换

转载 作者:太空宇宙 更新时间:2023-11-04 06:17:04 25 4
gpt4 key购买 nike

关于在我下面的代码中使用正确指针类型的问题。当我尝试在不将类型转换为 void * 的情况下初始化结构成员函数时,我收到了 “从不兼容的指针类型初始化”警告 ?

问题已通过类型转换解决,但我想使用右指针类型而不是转换为 void*。

代码片段:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


typedef void (*set_id)(int id);
typedef void (*set_name)(char *name);

typedef struct prop {
set_id *cb_setting_id;
set_name *cb_setting_name;
}prop;


prop *setting_id(int id) {
printf("ID:%d\n", id);
}

prop *setting_name(char *in) {
char *name;
name = in;
printf("Name:%s\n", name);
}
//Here type casted to void *, if not I get wrong pointer initalization
//error
prop cb_prop = { .cb_setting_id=(void *)setting_id,
.cb_setting_name=(void *)setting_name };

int main() {

prop *cb_event;
cb_event = &cb_prop;

cb_event->cb_setting_id = (void*)setting_id(2);
cb_event->cb_setting_name = (void*)setting_name("/dev/ttyS1");

return 0;
}

没有类型转换,警告是:

struct_callback.c:25:33: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
prop cb_prop = { .cb_setting_id=setting_id,
^
struct_callback.c:25:33: note: (near initialization for ‘cb_prop.cb_setting_id’)
struct_callback.c:32:26: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
cb_event->cb_setting_id = setting_id(2);

最佳答案

检查 e.g. 的定义set_id 类型别名,它是一个指向接受 int 参数但不返回任何内容的函数的指针。然后将它与 setting_id 函数进行比较,该函数接受一个 int 参数并返回一个指向 prop 的指针。这两种类型不兼容。情况变得更糟,因为 setting_id 函数被声明为返回指向 prop 的指针,但实际上并未返回任何内容。

不仅如此,结构中的成员也是指向例如set_id 这意味着 cb_setting_id 是指向函数的指针的指针。

稍后你会做

cb_event->cb_setting_id = (void*)setting_id(2);

这是错误的,因为它调用 setting_id 函数,并尝试将返回值分配给 cb_event->cb_setting_id。但是 setting_id 函数不返回任何内容。

第一个问题的解决方案是确保set_id类型和函数setting_id相等。

第二个问题的解决方案是不将成员声明为指针(因为它们已经是),或者将 set_id 更改为不是指针。

第三个问题的解决方案是删除那些行,因为前两个解决方案应该解决 cb_prop 结构的初始初始化。

关于c - 使用右指针类型,不想用 void * 进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43276609/

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