这应该是非常微不足道的。我正在使用一个非常基本的C程序来比较字符串:
#include <stdio.h>
int strcmp(char *s, char *t);
int main()
{
printf("Returned: %d\n", strcmp("abc", "adf"));
return 0;
}
int strcmp(char *s, char *t)
{
printf("Blah\n");
while (*s++ == *t++)
{
if (*s == '\0')
return 0;
}
return *s - *t;
}
所以我基本上实现了我自己的string.h中已经存在的strcmp函数版本。当我运行上面的代码时,我只看到返回值0,1或-1(至少对于我的一小组测试用例)而不是实际的预期结果。现在我意识到这是因为代码不是我的strcmp的实现版本,而是使用函数的string.h版本,但我很困惑,为什么会出现这种情况,即使我没有' t包括适当的头文件。
另外,看看它是如何使用头文件版本的,在编译代码时,我不应该得到“多个实现”错误(或者这些行中的某些内容)吗?
答案 0 :(得分:14)
你正在使用gcc,对吗? gcc在编译器中将一些函数实现为内置函数,它似乎是strcmp
is one of those。尝试使用-fno-builtin
开关编译文件。
头文件只告诉编译器存在某些符号,宏和类型。包含或不包含头文件不会对函数的来源产生任何影响,这是链接器的工作。如果gcc将strcmp
拉出libc,那么你可能会看到一个警告。
答案 1 :(得分:6)
不像以前的答案那样优雅,另一种完成这项工作的方法
#include <stdio.h>
static int strcmp(char *s, char *t); /* static makes it bind to file local sym */
int main()
{
printf("Returned: %d\n", strcmp("abc", "adf"));
return 0;
}
int strcmp(char *s, char *t)
{
printf("Blah\n");
while (*s++ == *t++)
{
if (*s == '\0')
return 0;
}
return *s - *t;
}
答案 2 :(得分:1)
不知道什么是编译器和lib。您使用的版本,所有结论都只是“可能性”。因此,stdio.h
已包含stdlib.h
或string.h
答案 3 :(得分:0)
strcmp
是标准库函数的名称。因此,您只能声明该函数(尽管您必须使用正确的声明);您不得为其提供其他定义。实现可以假设,无论何时使用strcmp
,即使您没有使用正确的#include
,也指的是标准库函数。
如果您想提供替代strcmp
,那么您应该给它另一个名称。