为了账号安全,请及时绑定邮箱和手机立即绑定

C中的隐函数声明

C中的隐函数声明

C
慕桂英546537 2019-07-04 17:31:48
C中的隐函数声明什么是“函数的隐式声明”?调用标准库函数而不包括适当的头文件会产生警告,例如:int main(){   printf("How is this not an error?");   return 0;}不应该在不声明函数是错误的情况下使用函数吗?请详细解释。我搜索了这个网站,发现了类似的问题,但没有找到明确的答案。大多数答案都提到了包含头文件以消除警告,但我想知道这怎么不是一个错误。
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

这应该被认为是一个错误。但C是一种古老的语言,所以它只是一种警告。
-Werror(GCC)解决这个问题。

当C找不到声明时,它假设这个隐式声明:int f();,这意味着函数可以接收给它的任何信息,并返回一个整数。如果这刚好够近的话(万一.printf),那么事情就可以运作了。在某些情况下(例如,函数实际上返回一个指针,并且指针比INT大),它可能会造成真正的麻烦。

请注意,这是修正在较新的C标准(C99,C11)。在这些标准中,这是一个错误。然而,gcc默认情况下不会实现这些标准,因此仍然会收到警告。


查看完整回答
反对 回复 2019-07-04
?
holdtom

TA贡献1805条经验 获得超10个赞

隐式声明在C中无效。

C99删除了这个特性(出现在C89中)。

gcc默认情况下只发出警告。-std=c99但是编译器有权拒绝翻译这样的程序。


查看完整回答
反对 回复 2019-07-04
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

C是一种非常低级的语言,因此它允许您创建几乎任何合法的对象(.o)文件。你应该把C看作是基本打扮的汇编语言。

特别是,C不要求在使用函数之前声明函数。如果您调用一个函数而不声明它,那么函数的使用就变成了它的(隐式)声明。在我刚刚运行的一个简单测试中,这只是对printf这样的内置库函数的警告(至少在GCC中是这样),但是对于随机函数,它会编译得很好。

当然,当您尝试链接,而它找不到foo,那么您将得到一个错误。

对于像printf这样的库函数,一些编译器包含它们的内置声明,这样它们就可以进行一些基本的类型检查,所以当隐式声明(从使用中)与内置声明不匹配时,您将得到一个警告。


查看完整回答
反对 回复 2019-07-04
  • 3 回答
  • 0 关注
  • 608 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信