忽略“从不兼容的指针类型初始化”警告?

时间:2009-11-19 14:20:00

标签: c gcc

是否存在编译器指令以忽略Hardware_MouseDrivers_GPM_MethodsHardware_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);
}

3 个答案:

答案 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树。