没有头文件的C函数

没有头文件的C函数,c,header-files,C,Header Files,这应该是非常琐碎的。我正在运行一个非常基本的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++)

这应该是非常琐碎的。我正在运行一个非常基本的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;
}
#包括
int strcmp(char*s,char*t);
int main()
{
printf(“返回:%d\n”,strcmp(“abc”,“adf”);
返回0;
}
int strcmp(字符*s,字符*t)
{
printf(“废话”);
而(*s++==*t++)
{
如果(*s=='\0')
返回0;
}
返回*s-*t;
}
因此,我基本上实现了string.h中已经存在的strcmp函数的我自己的版本。当我运行上述代码时,我只看到返回值0、1或-1(至少对于我的一小部分测试用例而言),而不是实际的预期结果。现在我意识到这是因为代码没有进入我的strcmp实现版本,而是使用了string.h版本的函数,但是我不明白为什么即使我没有包含适当的头文件也会出现这种情况


另外,看看它是如何使用头文件版本的,我在编译代码时是否应该出现“多个实现”错误(或者类似的错误)

您正在使用gcc,对吗?gcc在编译器中实现了一些内置函数,看起来是这样的。尝试使用
-fno builtin
开关编译文件


头文件只是告诉编译器某些符号、宏和类型存在。包含或不包含头文件对函数的来源没有任何影响,这是链接器的工作。如果gcc正在从libc中提取strcmp,那么您可能会看到一个警告。

而不知道编译器和lib是什么。你们使用的版本,所有的结论都是“可能的”。因此,
stdio.h
已经包含
stdlib.h
string.h

的最合理的东西并不像前面的答案那样优雅,这是实现这一点的另一种方法

#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;
}
#包括
静态int strcmp(char*s,char*t);/*静态使其绑定到文件本地sym*/
int main()
{
printf(“返回:%d\n”,strcmp(“abc”,“adf”);
返回0;
}
int strcmp(字符*s,字符*t)
{
printf(“废话”);
而(*s++==*t++)
{
如果(*s=='\0')
返回0;
}
返回*s-*t;
}

strcmp
是标准库函数的名称。因此,您只能声明函数(尽管您必须使用正确的声明);不允许为其提供其他定义。实现可以假设,无论何时使用strcmp
strcmp
,您都在引用标准库函数,即使您没有为其使用正确的
#include


如果你想提供一个替代的strcmp,那么你应该给它一个替代的名字。

顺便说一句,“mu太短”太长了:)你上一次的测试可能会失败,但仍然会增加你的指针…这就是你想要的吗?是的,你是对的。最后一行应该是return*(-s)-*(-t),我可以提供大多数库函数的重新定义。他们中的大多数人在glibc中被宣布为弱者;此外,标准仅在标题中说明定义。如果没有包含头,就没有任何“库函数”,我可以声明任何东西,甚至是
y0()
或以非标准方式定义某些东西,例如
double strcmp(int,float*)
。许多实现允许用户关闭关于标准库的假设(
-fno-builtin
-ffreestanding
)。标准说明了“托管环境”中的库(符合托管实现的
),但也有符合独立实现的