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, Понятно, что это два разных типа, отсюда и ошибка.

Другие вопросы по тегам