为什么strlen函数在没有#include 的情况下可以工作?

| 快速提问: 无论我是否
#include <string.h>
,0ѭ都可以完美工作 我从编译器得到的只是关于隐式声明的警告,但是在功能上它可以按预期工作。 这是为什么?     
已邀请:
C语言中的函数原型不是强制性的。它们是对编译器的有用指示,以便编译器可以对传递给它们的类型进行类型检查。当您不包括
string.h
时,该函数将采用默认签名,这就是收到警告的原因。     
当您调用未定义的行为时,一种可能的行为是该程序的行为符合您的预期,对您的系统而言,并与您安装的当前版本的库和系统软件一样。这并不意味着可以这样做。实际上,正确的C99编译器不应允许隐式函数声明;它应该给你一个错误。     
如果在范围内没有原型的情况下调用函数,则编译器将生成代码以调用函数,该函数接受传递的任何类型的参数并接受整数结果。如果参数与函数期望的参数匹配,并且函数以调用代码可以处理(*)的方式返回结果,则一切都会好起来。原型制作的目的是确保在可能的情况下将参数转换为预期的类型,并且如果无法转换则编译将失败。例如,如果非原型函数期望参数类型为'long \',并且尝试传递\'int \',则可能发生以下任何情况: 该程序可能会完全崩溃 事情可能会按预期进行 该函数可以执行,就好像传递了一些任意的不同参数值一样 该程序可能会继续运行,但是任意值会破坏任何或所有程序变量。 计算机可能导致恶魔可能飞出程序员的鼻子 相比之下,如果函数是原型的,则可以保证编译器在调用函数之前执行将'int'转换为'long \'所需的任何操作。 最初构思C时,原型不存在,程序员负责确保所有参数都以期望的精确类型传递。实际上,要确保所有函数参数始终都是正确的正确类型(例如,将值5传递给期望长的函数时,必须将其写为\“ 5L \”或\“确实很痛苦)。 (长)5 \“)。实际上,除了可变参数函数外,从没有任何理由依赖隐式参数类型。 (*)使用错误的参数类型可能发生的任何事情都可能使用错误的返回类型发生,除非期望函数返回\'int \'并且函数的实际返回值适合\'int \ ',与使用不正确的参数类型相比,结果更有可能是正确的。 (**)我能想到的唯一例外是,如果有人正在为某些无法使用原型感知的编译器的非常老的硬件进行编程,或者有人正在为代码高尔夫或类似竞赛而编程。后者我认为是解谜而不是编程,并且我不知道任何人都对使用前一种条件适用的硬件感兴趣。     
因为它的声明即等于所谓的“默认声明”。编译器期望任何未知函数返回int并期望在代码中第一次使用函数时传递的参数。     
通常这是因为还包含了另一个头文件,其中包括string.h。显然,认为不需要仅仅因为其他原因而包含某些内容是不正确的做法,但这很可能是造成这种影响的原因。     
我猜是因为在C中int是从函数返回的默认数据类型。 您能否给出更完整的代码示例。     
函数原型位于包含文件中。因此,即使您不包括这些文件,也会写入固定的原型“ 3”。现在库文件中有ѭ4files的代码,这些文件在运行时链接在一起,因此该函数可提供正确的输出(仅当它是具有固定原型prototype3ѭ的唯一函数时)。     

要回复问题请先登录注册