C编译 - “未定义引用”?

时间:2013-10-16 01:14:01

标签: c data-structures

我正在制作一个可靠的数据传输协议并拥有函数原型

void tolayer5(int, char data[]);

使用structs

struct msg {
  char data[20];
};

struct pkt {
   int seqnum;
   int acknum;
   int checksum;
   char payload[20];
};

当我以这种格式调用函数时:

tolayer5(A, packet.payload);

Aintpacket.payloadstruct pkt,我收到错误“'tolayer5(int, char*)'未定义的引用。你能帮我看一下吗?我在这里失踪了?

void tolayer5(int AorB, char data[])
{
  int i;
  if (TRACE>2)
  {
     printf("TOLAYER5: data received:");
     for (i=0; i<20; i++)
        printf("%c",data[i]);
     printf("\n");
  }
}

谢谢大家帮忙解决原始问题! :)然而,当我试图修复那个时,我遇到了一个无限循环,我认为这与我在一个数组中错误地处理字符有关(自从我这样做C之后已经有一段时间了。可以你帮我找到了我创造无限循环的地方吗?

我已将上述代码更新为我正在使用的内容。请注意主要的变化是我的功能:

void tolayer5(int AorB, char data[])

这一行在函数内部:printf("%c",msgReceived.data[i]);,因为现在它只是:

printf("%c",data[i]);

3 个答案:

答案 0 :(得分:12)

似乎你需要链接到实现tolayer5()

的obj文件

更新: 你的函数声明与实现不匹配:

      void tolayer5(int AorB, struct msg msgReceived)
      void tolayer5(int, char data[])

因此编译器会将它们视为两个不同的函数(您使用的是c ++)。它找不到你在main()中调用的实现。

答案 1 :(得分:1)

确保将tolayer5函数声明为原型,或者在您使用它的文件的前面定义完整的函数定义。

答案 2 :(得分:1)

正如其他一些人所说,这是一个链接错误。调用此函数的代码部分不知道此函数是什么。它需要在头文件中声明,在自己的源文件中定义,或者在相同的源文件中定义或声明,在它被调用的位置。

编辑:在旧版本的C,C89 / C90中,实际上并不需要函数声明。因此,您可以在您正在使用该函数的文件中的任何位置添加定义,即使在调用之后,编译器也会推断出声明。例如,

int main()
{
  int a = func();
}

int func()
{
   return 1;
}

然而,这不是今天的好习惯,大多数语言,例如C ++,都不允许这样做。在您使用它的同一源文件中定义函数的一种方法是在文件的开头声明它。所以,前面的例子将会是这样的。

int func();

int main()
{
   int a = func();
}

int func()
{
  return 1;
}