首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我没有“未定义的参考”呢?

为什么我没有“未定义的参考”呢?
EN

Stack Overflow用户
提问于 2016-09-05 13:38:45
回答 1查看 998关注 0票数 2

我在我的(大型)项目中遇到了一个相似问题

代码语言:javascript
复制
//# include <string.h> // not included

void foo(char * str, const char * delim)
{
    char * tok = strtok(str, delim); 
    // warning ^ "assignement makes pointer from integer without a cast"

    // [...]
}

答案(添加#include <string.h>以获得strtok原型)确实解决了这个问题。

但是,由于我的编译器/链接器知识很差,我无法理解流程是如何接受尚未原型化的函数的。我更希望错误undefined reference to function 'strtok',这是典型的,当您忘记包括正确的头。

编辑我理解为什么这个问题被标记为重复,但我确实认为它是不同的:我知道关于包含的“良好实践”,我只是想知道编译器的行为。然而,我承认我可以在这篇文章中找到我的问题的一部分答案:C89、C90或C99中的所有函数都需要原型吗?或这个:必须在C中声明函数原型吗?

EN

回答 1

Stack Overflow用户

发布于 2016-09-05 13:49:35

因为gcc会自动将您的代码链接到C库。“函数的未定义引用”错误通常由链接器在无法解析符号时发出,而且只有在链接的任何库中找不到符号时才会发生这种错误(链接的顺序可能也很重要)。但默认情况下,C库是链接的--就像您将它与-lc链接一样。所以,你不明白这个错误。

如果您告诉gcc不要使用-nostdlib链接C库,那么您将看到您期望的错误:

代码语言:javascript
复制
$ gcc -nostdlib file.c

另一方面,您应该始终为函数提供原型。

您可能对其他类似的链接器选项感兴趣,如-nodefaultlibsnostartfiles等,您可以在gcc手册中找到这些选项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39331877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档