是否存在编译器指令以忽略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);
}
答案 0 :(得分:5)
将赋值转换为正确的类型(函数指针使用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;
答案 1 :(得分:1)
我猜这个明显的答案是“为什么不修复代码以使用正确的指针类型”这个问题?
修改强>:
好的,我可以理解你不想不必要地使代码复杂化,但我不认为这是一个复杂的问题,甚至是一个不必要的复杂问题。
让我们看一下struct Hardware_MouseDriver 中的字段 open ,它应该是一个指向函数的指针,该函数将指向void的指针作为其第一个参数。 / p>
要初始化此字段,请使用指向函数 Hardware_MouseDrivers_GPM_Open 的指针,并在另一个位置使用指向函数 Hardware_MouseDrivers_DevInput_Open 的指针。这些都不会将指向void的指针作为它们的第一个参数,这当然是编译器警告的内容。
现在,如果一个void指针与这些指针的大小相同,并且它们的存储和处理方式之间没有其他惊人的差异,通过 open <调用这些函数/ strong>指针将按预期工作。很可能它会,并且我想,对于这种类型的低级代码,不太可能有人将它移植到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时会发生的问题。
答案 2 :(得分:0)
我遇到了这个问题,在仔细检查之后,我决定不应该收到此消息。结构中类似的行不会产生此错误。
使用(void *) function_name
对其进行了修复。
这使我不必检查gcc树。