关于在下面的代码中使用正确指针类型的问题。当我尝试在不使用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/

10-11 23:12
查看更多