Несовместимый тип из указателя typedef в c - PullRequest
1 голос
/ 28 апреля 2019

Используя VS 2019, следующая функция кода C дает мне предупреждение C4133, а также некоторые другие области в моем коде.Предупреждение гласит: «Предупреждение C4133 '=': несовместимые типы - от« client * »до« client_t »

Однако из моего typedef client * и client_t должны быть одинаковыми, если только я неправильно понимаю синтаксис для typdef,Ниже приведен один пример, где я получаю это предупреждение:

//Client information structure for linked list
typedef struct _client {
    char NAME[30];
    unsigned long PHONE;
    unsigned long ID;
    unsigned char CountryID;
    struct client *next;
    struct client *previous;
}client, *client_t;

/*Function to sequentually free every node in the doubly linked list
@param: client_t *head - reference pointer to the head pointer of the client linked list
*/
void RemoveClient(client_t *head) {
    if (head)
    {
        client_t current = *head;

        if (current && current->next) {
            while (current) {
                //Warning C4133 at the below line
                current = (*head)->next;
                free(*head);
                *head = current;
            }
        }
        else
        {
            free(*head);
        }
        current = NULL;
        *head = NULL;
    }
    else printf("head is a NULL pointer");
}

Ответы [ 2 ]

0 голосов
/ 28 апреля 2019

Что произошло, вы ссылаетесь на объявленный форвард тип, который не существует, с именем struct client:

//Client information structure for linked list
typedef struct _client {
    // ...
    struct client *next;
    struct client *previous;
}client, *client_t;

Это немного сложно.Во время ваших деклараций next и previous у вас есть тип с именем struct _client.Вскоре после этого у вас есть typedef с именем client.К сожалению, ни один из них struct clientТак как операции ссылаются только на указатель, но не отменяют ссылки на них, у вас не возникает никаких реальных ошибок, но когда вы ссылаетесь на next, компилятор говорит: «Да, struct client не является ни client, ни struct _client - будь осторожен! "

0 голосов
/ 28 апреля 2019

Спасибо Cyberbission за ваше предложение! Изменение моих компонентов внутри структуры на _client вместо использования более позднего данного определения клиента исправило для меня много предупреждений:

//Client information structure for linked list
typedef struct _client {
    char NAME[30];
    unsigned long PHONE;
    unsigned long ID;
    unsigned char CountryID;
    struct _client *next;
    struct _client *previous;
}client, *client_t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...