【发布时间】:2016-09-05 13:38:45
【问题描述】:
我在我的(大)项目中遇到了similar problem。
//# 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' 当您忘记包含正确的标题时这是典型的。
[编辑] 我理解为什么这个问题被标记为重复,但我认为它是不同的:我知道关于包含的“良好做法”,我只是想知道编译器的行为。但是我承认我可以在这篇文章中找到(部分)我的问题的答案:Are prototypes required for all functions in C89, C90 or C99? 或这个:Must declare function prototype in C?
【问题讨论】:
-
简短回答:如果将代码编译为 C99 或更高版本,则会出现错误。添加 gcc 标志
-std=c11或-std=c99。 -
编译器永远不会“抛出”(不管是什么意思)或报告这样的错误。那是链接器。并且不管“必须”如何:您绝对应该。过去 20 年的任何现代编码标准都需要这样做。
-
@Olaf 已修复(这实际上已经是关于我的帖子答案的线索)。我的编辑后有机会恢复“重复”标记吗?
-
我不认为这是不是重复,所以我不会投票重新开放。如果您想详细了解这一点,只需阅读标准或一本好的 C 书,(关于这个主题仅旧的可能会更好)。否则,只需启用警告,使用支持至少 C99 的现代 C 编译器,这样您就会收到警告,启用所有其他推荐的警告并...使用原型!
标签: c gcc compilation linker undefined-reference