关于在下面的代码中使用正确指针类型的问题。当我尝试在不使用void*类型转换的情况下初始化结构成员函数时,得到了“initialization from incompatible pointer type” warnings
?
问题已通过类型转换解决,但我希望使用右指针类型,而不是将其转换为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);
最佳答案
检查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/