【问题标题】:Continuous "undefined reference to..."连续“未定义的引用...”
【发布时间】:2014-12-26 22:13:34
【问题描述】:

我正在开发一个程序,但我不断收到“对 'dosell' 的未定义引用”,我无法完全弄清楚发生了什么。这是函数的声明:

void dosell(int *cash, int *numchips);

函数的使用:

choice = menu();

// Execute the appropriate choice.
if (choice == 1) {
    dobuy(&cash, &numchips);
}
else if (choice == 2) {
    dosell(&cash, &numchips);
}

还有函数本身:

void dosell(int *cash, int *numchips) {

   int numsell;

   // Determine the number of chips to be sold.
   printf("How many chips do you want to sell?\n");
   scanf("%d", &numsell);

   // Print out the error message if this is too much.
   if (numsell > *numchips)
       printf("Sorry, you do not have that many chips. No chips sold.\n");

   // Execute the transaction.
    else {
       (*cash) += sellchips(numsell);
       (*numchips) -= numsell;
}}}

【问题讨论】:

  • void dosell(int *cash, int *numchips) 是否声明或定义在 ABOVE 使用 else if (choice == 2) ... dosell(&cash, &numchips); 调用它的位置?
  • dosell() 是否与调用它在同一个文件中?如果没有,您是否链接两个(所有)文件来创建程序?最后的}}} 是什么?它看起来像一个语法错误,除非您不小心设法使用了 GCC 扩展——嵌套函数。你能显示确切的错误信息吗?是链接器错误还是编译器错误?
  • 这是一个链接器错误。链接器错过了提供dosell() 的定义/实现的对象。因此,原型设计和声明不是这里的问题,亲爱的评论者,因为后面的这些调整只影响编译器。
  • 相关(如果不是重复的话):stackoverflow.com/q/5892056/694576
  • @alk:相关,是的 - 它涵盖了一般情况。重复:我认为不会。目前,我寄希望于}}} 成为解决方案——这意味着dosell() 函数是在内部定义的,因此只能从其他一些不是调用dosell() 的函数的函数访问。但我们确实需要 OP 确认他正在使用 GCC(或者可能与 GCC 兼容的 clang/LLVM),以及此时问题或代码中是否存在拼写错误。

标签: c function undefined-reference


【解决方案1】:

将函数声明放在文件的开头,即在主函数之前和包含和定义之后:

void dosell(int *cash, int *numchips) ;

【讨论】:

  • 不错的猜测,但在 OP 提供足够的信息来确认这是问题所在之前,可能还为时过早......没有反对意见,只是一个有用的建议。
  • 问题中提到了声明。
  • 请看我对 OP 的评论。
  • 对不起!整个声明在main函数之前,它的使用,(第二段代码)在main里面,函数本身在之后。
【解决方案2】:

将关键 cmets 转换为答案

dosell() 是否与调用它在同一个文件中?如果没有,您是否链接两个(所有)文件来创建程序?

dosell() 末尾的}}} 是什么意思;它看起来像一个语法错误,除非你不小心使用了 GCC 扩展——nested functions

实际上要让 GCC 给你一个关于嵌套函数的警告需要相当多的努力。您可以通过指定一个标准来做到这一点,例如-std=c11-pedantic。但是,您不应该计划使用嵌套函数,尤其是不要意外。

我查看了}}},结果发现其中一个放错了位置。括号之一应该在dobuy() 函数的末尾,紧接在dosell() 函数之前。因此,它在dobuy() 中包含了dosell(),所以好像我什至没有编写dosell() 函数。

我观察到,如果您的代码已被自动缩进器缩进,您会看到 dosell() 的起始行已缩进,这可能会提示您有问题。您描述的症状与嵌套函数完全一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2018-07-25
    • 2012-06-29
    • 2011-07-14
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多