为什么字符串函数不包含字符串库?

时间:2016-05-01 01:33:32

标签: c string

在我的代码中,我调用string.h库中的函数(具体来说,strcmp()),但我忘了添加字符串库。即使没有包含字符串库,我的代码也会编译并正常运行,就好像我已经包含了字符串库一样。

发生了什么事?

4 个答案:

答案 0 :(得分:4)

头文件(例如string.h)仅包含函数声明:即返回类型,类型和参数数量。

C库中的函数已定义(默认情况下与您的代码相关联),因此无论您是否#include <string.h>,它们都可供您使用。但是,如果您没有#include头文件,编译器可能会警告您缺少函数声明,如果函数的返回类型不是int,则它也会导致问题(默认值为C)中声明的其他函数不是其他函数。

答案 1 :(得分:3)

从1999 ISO C标准开始,调用没有可见声明的函数是约束违规,需要诊断。诊断可能是非致命的警告。

默认情况下,某些C编译器不会强制执行较新的C99规则。例如,直到最近gcc的默认行为是-std=gnu89,它支持具有GNU特定扩展的1989/1990 C标准。

根据较旧的规则,如果调用没有可见声明的函数,则会创建一个隐式声明假设该函数返回int并期望参数的数量和类型&# 39;已通过它。如果该假设不正确,则呼叫的行为未定义。碰巧strcmp()返回int,所以如果编译器接受了这个电话,你可能会侥幸逃脱。

您应该了解如何让编译器至少警告您对未声明函数的调用。在您确认会这样做之后,您应该将代码#include <string.h>添加到您的代码中。

请注意,#include指令仅包含声明 strcmp的头文件和其他标准函数,而不是库。这些函数的定义(实现它们的代码)通常作为C标准库的一部分包含在内。将程序链接到标准库由链接器处理,而不是由编译器处理,它通常是隐式完成的(因为您要求编译和链接C程序)。 (数学库,取决于实现,可能不会自动链接,但字符串函数的实现几乎总是。)

答案 2 :(得分:0)

如果您包含 stdio 库,则实际上包含字符串库。但是stdio不包括字符串库(不是直接)

默认编译器包含所有必需的头文件,程序将成功运行。

答案 3 :(得分:0)

您使用的是哪个编译器? 你应该使用带有-strict标志和-error标志的C99编译器,如果你在不包含头文件的情况下调用函数,编译器会给你错误。

错误将如下所示 发现strcmp()的隐式声明