使用指向struct <typedef>的指针时,GCC会给出令人困惑的警告消息

时间:2015-10-07 18:24:31

标签: gcc gcc4

在编译以下C程序时,GCC会发出警告信息,这有点令人困惑。

计划来源

#include <stdio.h>

typedef struct {
    int x;
} dummy_t;

void myfunc (dummy_t   *pointer)
{
    printf("x = %d\n", pointer->x);
}

int main ()
{
    dummy_t    d = { 10 };

    /* INCORRECT. */
    myfunc((struct dummy_t *)&d);

    /* Correct. */
    // myfunc((dummy_t *)&d);

    return 0;
}

汇编

bash$ gcc c.c
c.c: In function ‘main’:
c.c:17:20: warning: passing argument 1 of ‘myfunc’ from incompatible pointer type
 myfunc((struct dummy_t *)&d);
                ^
c.c:7:6: note: expected ‘struct dummy_t *’ but argument is of type ‘struct dummy_t *’
void myfunc (dummy_t   *pointer)

注意两者如何报告预期类型和参数类型具有相同的值struct dummy_t *。这很令人困惑。

预期的类型不应该是dummy_t *吗?

以上程序是我遇到此问题的实际代码的简化版本。

海湾合作委员会版本

bash$ gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4

1 个答案:

答案 0 :(得分:3)

你是对的,错误信息令人困惑。较新的版本提供了更好的错误消息:

note: expected 'dummy_t * {aka struct <anonymous> *}' but argument is 
of type 'struct dummy_t *'

如您所见,dummy_tstruct dummy_t是不同的类型。有了这个声明:

typedef struct {
    int x;
} dummy_t;

您是 匿名结构的typedef。但是,稍后当您执行struct dummy_t时,您正在声明一个名为dummy_t的新结构。显然,这是两种不同的类型,因此是错误。