GCC выдает сбивающее с толку предупреждение при использовании указателя на структуру <typedef>
При компиляции следующей 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 *
?
Вышеприведенная программа является упрощенной версией реального кода, где я столкнулся с этой проблемой.
Версия GCC
bash$ gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
1 ответ
Вы правы, что сообщение об ошибке сбивает с толку. Более новая версия дает гораздо лучшее сообщение об ошибке:
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
, Понятно, что это два разных типа, отсюда и ошибка.