转发定义结构和类型,没有任何警告

时间:2017-01-10 01:31:34

标签: c struct forward-declaration gcc-pedantic

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

另一个要求是必须发生无警告 - 并启用-Wpedantic。我在 struct 中转发声明node.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"混淆。事情,那很简单,因为我说的文件是合并的。

什么前瞻性声明是正确的,没有警告?

1 个答案:

答案 0 :(得分:3)

请勿使用typedef,只需使用struct Edge*

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