在没有任何警告的情况下转发定义结构和类型

Forward define struct AND type without any warnings

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

另一个要求是 没有警告 必须出现 - 并且 -Wpedantic 已启用。我在 node.h 中转发声明一个 struct 以便我可以在函数调用中使用它:

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" 的事情弄糊涂了,这么简单是因为文件按照我说的那样合并了。

哪个前向声明是正确且没有警告的?

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

struct Edge; // forward declaration
struct Edge* node_find_edge(Node* node, NodeName target);