【发布时间】: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;:p和q是什么类型,为什么?”所以最好始终如一地写int *p, q;。 -
@Olaf 这确实是一个棘手的问题,人们将其作为唯一且唯一的论据为什么要在变量名上加上星号。我认为这个答案很好地概括了整个问题:stackoverflow.com/a/2660648/607407
标签: c struct forward-declaration gcc-pedantic