我被这个错误困住了:
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中按预期输出。
感谢您的帮助。
答案 0 :(得分:0)
pdb
的定义在struct Graph
文件中。编译graph.c
文件时,此定义不可见。您需要将定义移至cities.c
graph.h
根据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。仅在原型中。