正确的名称,但“将指针解引用为不完整的类型”

时间:2019-05-28 10:06:13

标签: c pointers struct

我被这个错误困住了:

cities.c: In function ‘main’:
cities.c:7:48: error: dereferencing pointer to incomplete type ‘struct Graph’
  printf("well, it got here. nodeCount: %d\n", x->nodeCount);

所有其他解决方案均指出,名称拼写错误,因此未定义,但是,如果将struct Graph定义移至标头,则可以正常工作。

我以前在我的其他库中使用过此机制,但仍然可以正常编译,我花了数小时试图四处移动,但无济于事。

graph.h:

#ifndef GRAPH_H
#define GRAPH_H

typedef struct Graph * Graph;

int graphCreate(Graph*, int);
int graphAddPath(Graph, int, int, unsigned int);
int graphRemovePath(Graph, int, int);
int graphDestroy(Graph*);

#endif /* GRAPH_H */

graph.c: https://pastebin.com/FzkaJJwP

city.c:

#include "graph.h"
#include <stdio.h>

int main() {
    Graph x;
    graphCreate(&x, 5);
    printf("well, it got here. nodeCount: %d\n", x->nodeCount);
}

在我的图书馆 https://git.mif.vu.lt/emiliskiskis/c_deck中按预期输出。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

  1. pdb的定义在struct Graph文件中。编译graph.c文件时,此定义不可见。您需要将定义移至cities.c

    graph.h
  2. 根据Blaze的建议,以下定义令人困惑。 struct Graph { unsigned int **matrix; int nodeCount; }; 。更好的解决方案是

    typedef struct Graph * Graph

,然后在代码中可以使用

typedef struct Graph Graph;

答案 1 :(得分:0)

编译器消息很清楚。类型是不完整的,这基本上意味着编译器仅知道它存在一个名为Graph的结构,但不知道它的外观。这样的结果是您无法访问这些字段。

因此,首先您必须回答这个问题。您是否希望使用该库的程序员能够访问Graph的字段?如果否,则将定义放入.c文件中。如果是,则将定义放入.h文件。

还要考虑的另一件事是typedef struct Graph * Graph。在对结构体进行类型定义时,您隐藏了很多信息,而在对指针进行类型定义时,情况也是如此。现在您同时做这两个。我个人认为,除非上述问题的答案为“否”,否则您确实应该避免这样做。

我的建议是,如果您希望库的用户能够访问struct Graph的字段,请完全删除typedef。如果要向用户隐藏它,可以使用代码访问功能,如下所示:

// cities.h
int getNodeCount(Graph g);
// cities.c
int getNodeCount(struct Graph * g) {
    return g->nodeCount;
}

并像这样使用它:

Graph g;
int nodeCount = getNodeCount(g);

请注意,我没有在函数定义中使用typedef。仅在原型中。