是否有编译器指令来忽略Hardware_MouseDrivers_GPM_Methods和Hardware_MouseDrivers_DevInput_Methods中的“初始化来自不兼容的指针类型”的警告?不过,全局关闭警告并不是一种选择。
#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);
}发布于 2009-11-19 22:29:29
将赋值转换为适当的类型(使用void *的函数指针,而不是实例指针):
.open= (int (*)(void*, char *))Hardware_MouseDrivers_GPM_Open;或者创建一个类型并在结构的定义和初始化中使用它:
typedef int (*openfcnt_t)(void*, char *);
typedef struct _Hardware_MouseDriver {
openfnct_t open;
} Hardware_MouseDriver;然后
.open= (openfnct_t)Hardware_MouseDrivers_GPM_Open;编辑:
经过进一步的思考,对于C程序来说,最简单、最不麻烦的方法是:
.open= (void *)Hardware_MouseDrivers_GPM_Open;发布于 2009-11-19 22:27:48
我想最明显的答案是这个问题“为什么不修复代码来使用正确的指针类型”?
编辑
好吧,我可以理解你不想让代码变得不必要地复杂,但我不认为它有那么多的复杂性,甚至不是不必要的。
让我们看一下结构Hardware_MouseDriver,中的字段,它应该是指向一个函数的指针,该函数的第一个参数是指向空的指针。
要初始化此字段,请使用指向函数Hardware_MouseDrivers_GPM_Open,的指针,并在另一个位置使用指向函数Hardware_MouseDrivers_DevInput_Open.的指针所有这些函数都没有将指向void的指针作为其第一个参数,这当然是编译器所警告的。
现在,如果空指针的大小与这些指针相同,并且它们的存储和处理方式之间没有其他令人惊讶的差异,则通过打开指针调用这些函数将按预期工作。它很可能会,我猜,对于这种类型的低级代码,不太可能有人会将它移植到TOPS 20或其他什么地方。但不能保证它会工作,而且(在我看来)它看起来很奇怪。(很明显,对编译器也是如此!)
所以我的建议是像这样修改代码:
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_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时会发生的问题,会更容易,也更不复杂。
发布于 2019-03-09 22:33:16
我有这个问题,经过仔细的检查,我决定我不应该得到这个信息。结构中的类似行不会生成此错误。
使用(void *) function_name修复了这个问题。
这就省去了我检查gcc树的麻烦。
https://stackoverflow.com/questions/1763616
复制相似问题