Предупреждение: имена параметров (без типов) в объявлении функции

#c

#c

Вопрос:

К ВАШЕМУ сведению, вопрос новичка.

Всякий раз, когда я компилирую / запускаю код, 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 */ 
}
  

Передача структуры по значению часто не подходит, поэтому я изменил ее на передачу по ссылке.

Ответ №2:

В prog3.c

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

Это старый синтаксис (очень старый: до того, как ANSI стандартизировал C в 1989 году), но совершенно легальный в C89 и C99. Хотя не используйте это: предпочитайте

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

Ответ №3:

В объявлении extern tolayer2(rtpktTo1); , rtpktTo1 указано имя параметра (как указано в ошибке), в то время как вы должны указать там тип:

 extern tolayer2(struct rtpkt);
  

или

 extern tolayer2(struct rtpkt *);
  

или

 extern tolayer2(struct rtpkt const *);
  

или аналогичный, поскольку это то, что компилятор должен знать о вашей функции перед компиляцией клиентского кода. Имя параметра бесполезно для компилятора на данном этапе и, следовательно, необязательно.

(И действительно, вам также следует добавить возвращаемый тип, и обратите внимание, что это extern не имеет значения в вашем struct определении.)

Комментарии:

1. Это тоже было полезно, спасибо. Проблема была с внешним вызовом, я допустил ошибку при вводе в prog3.c.