我在我的(大型)项目中遇到了一个相似问题。
//# 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中声明函数原型吗?。
发布于 2016-09-05 13:49:35
因为gcc会自动将您的代码链接到C库。“函数的未定义引用”错误通常由链接器在无法解析符号时发出,而且只有在链接的任何库中找不到符号时才会发生这种错误(链接的顺序可能也很重要)。但默认情况下,C库是链接的--就像您将它与-lc链接一样。所以,你不明白这个错误。
如果您告诉gcc不要使用-nostdlib链接C库,那么您将看到您期望的错误:
$ gcc -nostdlib file.c另一方面,您应该始终为函数提供原型。
您可能对其他类似的链接器选项感兴趣,如-nodefaultlibs、nostartfiles等,您可以在gcc手册中找到这些选项。
https://stackoverflow.com/questions/39331877
复制相似问题