1

我们大学的作业提交系统 - 而不是专注于编程技能 - 对提交设置了荒谬和不切实际的要求。为了绕过它,我使用预处理器和其他一些技巧将我的作业解决方案合并到一个文件中(要求之一)。

另一个要求是不得出现警告- 并且-Wpedantic已启用。我前向声明 a structinnode.h以便可以在函数调用中使用它:

typedef struct Edge Edge;
// So that I can do:
typedef struct Node {
    void* value;
    int name;
    Array* edges;
} Node;
Edge* node_find_edge(Node* node, NodeName target);

在另一个文件edge.h中 - 完整定义如下:

typedef struct Edge {
    size_t cost;
    NodeName A;
    NodeName B;
} Edge;

我收到这个警告:

main.c: At top level:
main.c:779:3: warning: redefinition of typedef 'Edge' [-Wpedantic]
 } Edge;
   ^
main.c:753:21: note: previous declaration of 'Edge' was here
 typedef struct Edge Edge;

不要被“main.c”的东西弄糊涂了,因为文件像我说的那样被合并了。

什么前向声明是正确且无警告的?

4

1 回答 1

3

不要使用typedef,只需使用struct Edge*

struct Edge; // forward declaration
struct Edge* node_find_edge(Node* node, NodeName target);
于 2017-01-10T01:40:41.860 回答