【问题标题】:Dereferencing pointer to incomplete type ‘struct' [closed]取消引用指向不完整类型'struct'的指针[关闭]
【发布时间】:2019-08-21 20:48:30
【问题描述】:

在“esame.h”中我声明了typedef struct esame *esame;,在“esame.c”中我声明了:

struct esame{
    char corso[20];
    int voto;
    char data[11];
};

在“libretto.h”中我声明了typedef struct libretto *libretto;,在“libretto.c”中我声明了:

struct libretto{
    esame esami[MAXESAMI];
};

但是如果例如我尝试printf这个

printf("Corso: %s\nVoto: %d\nData: %s\n", l->esami[i]->corso, l->esami[i]->voto, l->esami[i]->data);

它给了我这个错误,为什么?

error: dereferencing pointer to incomplete type ‘struct esame’
    printf("Corso: %s\nVoto: %d\nData: %s\n", l->esami[i]->corso, l->esami[i]->voto, l->esami[i]->data);

【问题讨论】:

  • esame esami[MAXESAMI]; -> struct esame esami[MAXESAMI];
  • @EugeneSh。数组类型有不完整的元素类型‘struct esame’ struct esame esami[MAXESAMI];
  • struct 声明也应该在头文件中,并且最好避免使用指针的typedef
  • @WeatherVane 我也在头文件中添加了这两个结构,它给了我更多错误

标签: c struct typedef


【解决方案1】:

我习惯在头文件中声明类型,然后像您一样在实现中定义它们,但方式略有不同。我就是这样做的:

  • 在头文件中
typedef struct{
    char corso[20];
    int voto;
    char data[11];
}esame, *ptr_esame;
  • 在实现文件中,您可以使用如下类型:
esame esami[MAXESAMI];
ptr_esame testa = esami;

我真的不知道为什么这个typedef struct esame *esame; 在语法上是正确的,因为即使阅读它也没有意义。无论如何,不​​关我的事。

请记住,当多个源包含头文件时,重新定义可能很容易发生,因此请使用预编译器保护来避免这些问题。

#ifndef __ESAME_H__
#define __ESAME_H__

typedef struct{
    char corso[20];
    int voto;
    char data[11];
}esame, *ptr_esame;

...

#endif

【讨论】:

    猜你喜欢
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2017-03-21
    • 2013-03-11
    相关资源
    最近更新 更多