在具有单个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;
}
答案 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)
这是为什么不能定义指针
的示例**
指针)。 这更加清晰,可读并且可以编译
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;
类似地修复其他此类实例。