首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否忽略“初始化来自不兼容的指针类型”警告?

是否忽略“初始化来自不兼容的指针类型”警告?
EN

Stack Overflow用户
提问于 2009-11-19 22:20:00
回答 3查看 10.4K关注 0票数 4

是否有编译器指令来忽略Hardware_MouseDrivers_GPM_MethodsHardware_MouseDrivers_DevInput_Methods中的“初始化来自不兼容的指针类型”的警告?不过,全局关闭警告并不是一种选择。

代码语言:javascript
复制
#include <stdio.h>

/* Mouse driver interface */

typedef struct _Hardware_MouseDriver {
        int (*open)(void*, char *);
        int (*close)(void*);
        int (*poll)(void*);
} Hardware_MouseDriver;

/* GPM */

typedef struct _Hardware_MouseDrivers_GPM {
        char *path;
} Hardware_MouseDrivers_GPM;

static int Hardware_MouseDrivers_GPM_Open(Hardware_MouseDrivers_GPM *this, char *path);
static int Hardware_MouseDrivers_GPM_Close(Hardware_MouseDrivers_GPM *this);
static int Hardware_MouseDrivers_GPM_Poll(Hardware_MouseDrivers_GPM *this);

static int Hardware_MouseDrivers_GPM_Open(Hardware_MouseDrivers_GPM *this, char *path) {
        printf("GPM: Opening %s...\n", path);
        this->path = path;
}

static int Hardware_MouseDrivers_GPM_Close(Hardware_MouseDrivers_GPM *this) {
        printf("GPM: Closing %s...\n", this->path);
}

static int Hardware_MouseDrivers_GPM_Poll(Hardware_MouseDrivers_GPM *this) {
        printf("GPM: Polling %s...\n", this->path);
}

Hardware_MouseDriver Hardware_MouseDrivers_GPM_Methods = {
        .open  = Hardware_MouseDrivers_GPM_Open,
        .close = Hardware_MouseDrivers_GPM_Close,
        .poll  = Hardware_MouseDrivers_GPM_Poll
};

/* DevInput */

typedef struct _Hardware_MouseDrivers_DevInput {
        char *path;
} Hardware_MouseDrivers_DevInput;

static int Hardware_MouseDrivers_DevInput_Open(Hardware_MouseDrivers_DevInput *this, char *path);
static int Hardware_MouseDrivers_DevInput_Close(Hardware_MouseDrivers_DevInput *this);
static int Hardware_MouseDrivers_DevInput_Poll(Hardware_MouseDrivers_DevInput *this);

static int Hardware_MouseDrivers_DevInput_Open(Hardware_MouseDrivers_DevInput *this, char *path) {
        printf("DevInput: Opening %s...\n", path);
        this->path = path;
}

static int Hardware_MouseDrivers_DevInput_Close(Hardware_MouseDrivers_DevInput *this) {
        printf("DevInput: Closing %s...\n", this->path);
}

static int Hardware_MouseDrivers_DevInput_Poll(Hardware_MouseDrivers_DevInput *this) {
        printf("DevInput: Polling %s...\n", this->path);
}

Hardware_MouseDriver Hardware_MouseDrivers_DevInput_Methods = {
        .open  = Hardware_MouseDrivers_DevInput_Open,
        .close = Hardware_MouseDrivers_DevInput_Close,
        .poll  = Hardware_MouseDrivers_DevInput_Poll
};

/* Test drivers */

void TestDriver(Hardware_MouseDriver driver, void *data) {
        /* Access the driver using a generic interface
         * (Hardware_MouseDriver) */
        driver.poll(data);
}

void main() {
        Hardware_MouseDrivers_GPM gpm;
        Hardware_MouseDrivers_DevInput devinput;

        Hardware_MouseDrivers_GPM_Open(&gpm, "/dev/gpmctl");
        Hardware_MouseDrivers_DevInput_Open(&devinput, "/dev/input/mice");

        TestDriver(Hardware_MouseDrivers_GPM_Methods, &gpm);
        TestDriver(Hardware_MouseDrivers_DevInput_Methods, &devinput);

        Hardware_MouseDrivers_GPM_Close(&gpm);
        Hardware_MouseDrivers_DevInput_Close(&devinput);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-19 22:29:29

将赋值转换为适当的类型(使用void *的函数指针,而不是实例指针):

代码语言:javascript
复制
 .open= (int (*)(void*, char *))Hardware_MouseDrivers_GPM_Open;

或者创建一个类型并在结构的定义和初始化中使用它:

代码语言:javascript
复制
typedef int (*openfcnt_t)(void*, char *);

typedef struct _Hardware_MouseDriver {
        openfnct_t open;
} Hardware_MouseDriver;

然后

代码语言:javascript
复制
 .open= (openfnct_t)Hardware_MouseDrivers_GPM_Open;

编辑:

经过进一步的思考,对于C程序来说,最简单、最不麻烦的方法是:

代码语言:javascript
复制
 .open= (void *)Hardware_MouseDrivers_GPM_Open;
票数 5
EN

Stack Overflow用户

发布于 2009-11-19 22:27:48

我想最明显的答案是这个问题“为什么不修复代码来使用正确的指针类型”?

编辑

好吧,我可以理解你不想让代码变得不必要地复杂,但我不认为它有那么多的复杂性,甚至不是不必要的。

让我们看一下结构Hardware_MouseDriver,中的字段,它应该是指向一个函数的指针,该函数的第一个参数是指向空的指针。

要初始化此字段,请使用指向函数Hardware_MouseDrivers_GPM_Open,的指针,并在另一个位置使用指向函数Hardware_MouseDrivers_DevInput_Open.的指针所有这些函数都没有将指向void的指针作为其第一个参数,这当然是编译器所警告的。

现在,如果空指针的大小与这些指针相同,并且它们的存储和处理方式之间没有其他令人惊讶的差异,则通过打开指针调用这些函数将按预期工作。它很可能会,我猜,对于这种类型的低级代码,不太可能有人会将它移植到TOPS 20或其他什么地方。但不能保证它会工作,而且(在我看来)它看起来很奇怪。(很明显,对编译器也是如此!)

所以我的建议是像这样修改代码:

代码语言:javascript
复制
static int Hardware_MouseDrivers_GPM_Open(Hardware_MouseDrivers_GPM *this, char *path) {
    printf("GPM: Opening %s...\n", path);
    this->path = path;
}

到稍微复杂一点的:

代码语言:javascript
复制
static int Hardware_MouseDrivers_GPM_Open(void *arg1, char *path) {
    Hardware_MouseDrivers_GPM *this = arg1;
    printf("GPM: Opening %s...\n", path);
    this->path = path;
}

我认为这种改变比(1)关闭警告,(2)记录它以便读者理解为什么这个警告在这里不重要,(3)更多地记录它以便读者真正相信你知道你在做什么,以及(4)处理如果有人真的将你的代码移植到TOPS 20时会发生的问题,会更容易,也更不复杂。

票数 1
EN

Stack Overflow用户

发布于 2019-03-09 22:33:16

我有这个问题,经过仔细的检查,我决定我不应该得到这个信息。结构中的类似行不会生成此错误。

使用(void *) function_name修复了这个问题。

这就省去了我检查gcc树的麻烦。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1763616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档