Переопределение анонимных типов во внешней библиотеке - разыменование указателя на неполный тип - PullRequest
2 голосов
/ 04 мая 2019

В функции с одним аргументом va_list я пытаюсь приписать список переменных согласно внешне определенной (заголовочный файл) структуре wifi_ap_record_t (другие значения для ясности опущены).

Определение типа в "wifi_ap_record_t_header_location.h" выглядит следующим образом, это внешняя библиотека, которую я не могу редактировать:

typedef struct {
    uint8_t ssid[33];                     /**< SSID of AP */

} wifi_ap_record_t;

При компиляции я получаю следующую ошибку: error: dereferencing pointer to incomplete type 'const struct wifi_ap_record_t', который расстроен из-за указателя p->ssid. Я попытался переопределить typedef с указателем и без него, а также определить пустую переменную wifi_ap_record типа wifi_ap_record_t.

Код как ниже, чего здесь не хватает?

#include "wifi_ap_record_t_header_location.h"

typedef struct wifi_ap_record_t* wifi_ap_record;

void function(va_list *ap) {
  const struct wifi_ap_record_t *p = va_arg(*ap, const struct wifi_ap_record *);
  printf("ssid: %s", p->ssid;
}

Ответы [ 3 ]

2 голосов
/ 04 мая 2019

После typedef во внешней библиотеке имя типа будет wifi_ap_record_t, а не struct wifi_ap_record_t.

Имена, начинающиеся с struct, - это отдельный пробел, но имен с определением типа в нем нет, даже если они ссылаются на тип структуры.

В вашем коде не должно быть ключевого слова struct. Указатель на эту структуру будет иметь тип wifi_ap_record_t*, а не struct wifi_ap_record_t*. Вам не нужен ваш собственный typedef.

2 голосов
/ 04 мая 2019

это пример того, почему указатели не должны быть определенными по типу

  1. У вас есть куча других предупреждений, которые вы игнорируете, и это неправильно.
  2. Не скрывайте указатели в typedefs - даже если в этом примере из 5 строк вы уже потеряли контроль над тем, что является указателем, а что нет (и у вас есть ** указатель там).

Это намного понятнее, удобочитаемее и компилируется. ОК

  wifi_ap_record_t *p = va_arg(*ap, wifi_ap_record_t *);
  printf("ssid: %s", p ->ssid);
0 голосов
/ 04 мая 2019

Алекс, определите свою структуру следующим образом:

struct wifi_ap_record_t{
    uint8_t ssid[33];                     /**< SSID of AP */

};

Кажется, что вы определили структуру, но без имени.Также вы создали объект из этого.

Если это внешняя структура, проверьте, определена ли эта структура под какой-либо другой структурой.Для получения дополнительной информации см. этот вопрос.

Наконец, как говорится в другом ответе и комментарии, вы должны удалить слово struct при определении объекта.Таким образом, оно станет:

typedef wifi_ap_record_t* wifi_ap_record;

Аналогичным образом исправьте другие подобные случаи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...