在编译以下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
答案 0 :(得分:3)
你是对的,错误信息令人困惑。较新的版本提供了更好的错误消息:
note: expected 'dummy_t * {aka struct <anonymous> *}' but argument is
of type 'struct dummy_t *'
如您所见,dummy_t
和struct dummy_t
是不同的类型。有了这个声明:
typedef struct {
int x;
} dummy_t;
您是struct dummy_t
时,您正在声明一个名为dummy_t
的新结构。显然,这是两种不同的类型,因此是错误。