【问题标题】:C compiling - "undefined reference to"?C编译-“未定义的引用”?
【发布时间】:2013-10-16 01:14:00
【问题描述】:

我正在做一个可靠的数据传输协议并且有函数原型

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]);

【问题讨论】:

  • 这是一个链接错误,你确定你也在void tolayer5(int, char data[]);的实现中链接吗?
  • 是你项目中实现tolayer5的c文件。
  • 重新编辑:您的原型与其实现不兼容。 char[] vs struct msg.
  • 您实际上引用了三种不同类型的函数,即 char*、struct msg 和 struct pkt。你可以使用任何,但正如@DanielSloof 所说,它必须与原型匹配。
  • 为什么要同时标记[C]和[C++]。这些语言之间的链接问题可能完全不同。是 C 还是 C++ 的问题?

标签: c data-structures


【解决方案1】:

看来你需要链接实现tolayer5()的obj文件

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

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

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

【讨论】:

  • 就是这样,我的 tolayer5() 函数不在目标文件中;它在同一个文件中,只是向下。
  • 啊,我明白了!我一定不能改变我之前调用该函数的方式。谢谢! :)
【解决方案2】:

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

【讨论】:

  • 我当前的函数原型是我列出的那个 (void tolayer5(int, char data[]);) 你的意思是像“void tolayer5(int blah1, char blah2[]);”这样的东西吗?当我尝试这样做时,它给了我同样的错误。
【解决方案3】:

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

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

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

int func()
{
   return 1;
}

然而,这在今天并不是很好的做法,而且大多数语言(例如 C++)都不允许这样做。在您使用它的同一源文件中定义函数的一种方法是在文件的开头声明它。所以,前面的例子看起来应该是这样的。

int func();

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

int func()
{
  return 1;
}

【讨论】:

  • 根据我列出的信息,放在顶部的正确函数头是什么?我真的不确定我缺少什么来链接它。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 2021-06-08
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
相关资源
最近更新 更多