警告:函数声明中的参数名称(无类型)

时间:2011-04-19 07:22:10

标签: c

新秀问题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 */ 
}

3 个答案:

答案 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)
{ /* ... */ }