新秀问题FYI。
每当我编译/运行代码时, extern tolayer2(rtpktTo1); 我会收到警告。 警告读取,如标题中的警告:函数声明中的参数名称(无类型)
任何帮助表示赞赏。
node0.c
extern struct rtpkt {
int sourceid; /* id of sending router sending this pkt */
int destid; /* id of router to which pkt being sent
(must be an immediate neighbor) */
int mincost[4]; /* current understanding of min cost to node 0 ... 3 */
};
/* Create routing packets (rtpkt) and send to neighbors via tolayer2(). */
struct rtpkt rtpktTo1;
rtpktTo1.sourceid = 0;
rtpktTo1.destid = 1;
rtpktTo1.mincost[0] = minCost[0];
rtpktTo1.mincost[1] = minCost[1];
rtpktTo1.mincost[2] = minCost[2];
rtpktTo1.mincost[3] = minCost[3];
extern tolayer2(rtpktTo1);
prog3.c
tolayer2(packet)
struct rtpkt packet;
{
/* This has a lot of code in it */
}
答案 0 :(得分:1)
rkpktTo1.
*的赋值显然不在函数或声明中,除非这是一个代码片段。将它们包裹在一个函数中。警告有点误导。
tolayer2()
的声明应该有一个返回类型和一个参数类型。由于没有一个,假设int
。这可能不是预期的,但它应该在没有警告和错误的情况下编译:
node0.c
struct rtpkt {
int sourceid; /* id of sending router sending this pkt */
int destid; /* id of router to which pkt being sent
(must be an immediate neighbor) */
int mincost[4]; /* current understanding of min cost to node 0 ... 3 */
};
/* Create routing packets (rtpkt) and send to neighbors via tolayer2(). */
void function () {
struct rtpkt rtpktTo1;
rtpktTo1.sourceid = 0;
rtpktTo1.destid = 1;
rtpktTo1.mincost[0] = minCost[0];
rtpktTo1.mincost[1] = minCost[1];
rtpktTo1.mincost[2] = minCost[2];
rtpktTo1.mincost[3] = minCost[3];
}
extern void tolayer2(struct rtpkt *rtpktTo1);
prog3.c
void
tolayer2(struct rtpkt *packet)
{
/* This has a lot of code in it */
}
按值传递结构通常是不合适的,所以我将其更改为通过引用传递。
答案 1 :(得分:0)
在声明extern tolayer2(rtpktTo1);
中,rtpktTo1
是一个参数名称(如错误所示),而你应该在那里给出一个类型:
extern tolayer2(struct rtpkt);
或
extern tolayer2(struct rtpkt *);
或
extern tolayer2(struct rtpkt const *);
或类似的,因为这是编译器在编译客户端代码之前需要了解的函数。此时参数名对编译器无用,因此是可选的。
(实际上,您也应该添加一种返回类型,并注意extern
在您的struct
定义中没有任何意义。)
答案 2 :(得分:0)
在prog3.c中
tolayer2(packet)
struct rtpkt packet;
{ /* ... */ }
这是旧语法(非常陈旧:1989年ANSI标准化C之前),但在C89和C99中完全合法。不要使用它:prefer
int tolayer2(struct rtpkt packet)
{ /* ... */ }