【问题标题】:Forward define struct AND type without any warnings前向定义结构和类型,没有任何警告
【发布时间】:2017-01-10 01:31:33
【问题描述】:

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

另一个要求是必须没有警告 - 并且-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 Edge; 或替换为完整定义
  • 无警告编译的要求主要是一件好事——理论上警告表明错误(可能比错误更严重)。
  • 旁注:指针的* 属于名称,而不是类型。技巧问题:“int* p, q;pq 是什么类型,为什么?”所以最好始终如一地写int *p, q;
  • @Olaf 这确实是一个棘手的问题,人们将其作为唯一且唯一的论据为什么要在变量名上加上星号。我认为这个答案很好地概括了整个问题:stackoverflow.com/a/2660648/607407

标签: c struct forward-declaration gcc-pedantic


【解决方案1】:

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

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

【讨论】:

  • 也可以建议使用struct Node。这是 OP 将来可能会遇到的另一种 typedef。
  • @StoryTeller 没有前向声明,结构声明就在那里。
  • 我什至明确写过我也需要/想要定义类型。这样我就可以使用Edge,而不是struct Edge
  • @TomášZato 你在哪里写的?
  • @TomášZato 也许您可以安排您的标题,以便typedef struct Edge Edge; 位于其自己的标题中(带有包含保护),例如edge_fwd.h,然后由edge.hnode.h 包含/跨度>
猜你喜欢
  • 2021-03-08
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
相关资源
最近更新 更多