#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.