2011-04-19 136 views
0

新秀問題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 */ 
} 

回答

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 */ 
} 

按值傳遞的結構是通常不適合,所以我改變了它通過引用傳遞。

+0

非常感謝! – 2011-04-19 07:39:49

0

在聲明extern tolayer2(rtpktTo1);rtpktTo1是一個參數名稱(如錯誤說),而你應該給一個類型有:

extern tolayer2(struct rtpkt); 

extern tolayer2(struct rtpkt *); 

extern tolayer2(struct rtpkt const *); 

或類似的,因爲這是編譯器需要知道有關編譯客戶端代碼之前,你的功能是什麼。此時參數名稱對編譯器無用,因此是可選的。

(真的,你應該添加一個返回類型爲好,並注意extern在您struct定義沒有意義。)

+0

這也有幫助,謝謝。問題出在外部調用,我在輸入prog3.c時犯了一個錯誤。 – 2011-04-19 07:40:56

0

在prog3.c

tolayer2(packet) 
    struct rtpkt packet; 
{ /* ... */ } 

這是舊的語法(很老:之前在1989 ANSI標準化C),但在C89和C99完全合法的。不要使用它:prefer

int tolayer2(struct rtpkt packet) 
{ /* ... */ } 
相關問題