在外部库中重新定义匿名类型-取消引用不完整类型的指针

时间:2019-05-04 05:40:44

标签: c

在具有单个va_list arg的函数中,我尝试根据外部定义的(头文件)struct 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 个答案:

答案 0 :(得分:2)

在外部库中的typedef之后,类型的名称为wifi_ap_record_t,而不是struct wifi_ap_record_t

struct开头的名称是一个单独的空格,但是类型定义的名称不在其中,即使它们引用的是结构类型。

您自己的代码中不应包含struct关键字。指向该结构的指针的类型为wifi_ap_record_t*,而不是struct wifi_ap_record_t*。您不需要自己的typedef。

答案 1 :(得分:2)

这是为什么不能定义指针

的示例
  1. 您还有很多其他警告,可以忽略,这是错误的。
  2. 不要在typedefs中隐藏指针-即使这5行示例已经失去了对什么是指针以及什么不是指针的控制(并且那里有**指针)。

这更加清晰,可读并且可以编译

  wifi_ap_record_t *p = va_arg(*ap, wifi_ap_record_t *);
  printf("ssid: %s", p ->ssid);

答案 2 :(得分:0)

Alex,像这样定义您的结构:

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

};

似乎您已经定义了一个结构,但没有任何名称。此外,您还从中创建了一个对象。

如果是外部结构,请检查该结构是否在任何其他结构下定义。有关更多信息,请参见this问题。

最后,如其他答案和评论所述,在定义对象时,应删除struct单词。因此,它将变为:

typedef wifi_ap_record_t* wifi_ap_record;

类似地修复其他此类实例。