C中的隐函数声明

C中的隐函数声明

什么是“函数的隐式声明”?调用标准库函数而不包括适当的头文件会产生警告,例如:

int main(){
  printf("How is this not an error?");
  return 0;}

不应该在不声明函数是错误的情况下使用函数吗?请详细解释。我搜索了这个网站,发现了类似的问题,但没有找到明确的答案。大多数答案都提到了包含头文件以消除警告,但我想知道这怎么不是一个错误。


慕桂英546537
浏览 609回答 3
3回答

收到一只叮咚

这应该被认为是一个错误。但C是一种古老的语言,所以它只是一种警告。用-Werror(GCC)解决这个问题。当C找不到声明时,它假设这个隐式声明:int f();,这意味着函数可以接收给它的任何信息,并返回一个整数。如果这刚好够近的话(万一.printf),那么事情就可以运作了。在某些情况下(例如,函数实际上返回一个指针,并且指针比INT大),它可能会造成真正的麻烦。请注意,这是修正在较新的C标准(C99,C11)。在这些标准中,这是一个错误。然而,gcc默认情况下不会实现这些标准,因此仍然会收到警告。

holdtom

隐式声明在C中无效。C99删除了这个特性(出现在C89中)。gcc默认情况下只发出警告。-std=c99但是编译器有权拒绝翻译这样的程序。

慕哥9229398

C是一种非常低级的语言,因此它允许您创建几乎任何合法的对象(.o)文件。你应该把C看作是基本打扮的汇编语言。特别是,C不要求在使用函数之前声明函数。如果您调用一个函数而不声明它,那么函数的使用就变成了它的(隐式)声明。在我刚刚运行的一个简单测试中,这只是对printf这样的内置库函数的警告(至少在GCC中是这样),但是对于随机函数,它会编译得很好。当然,当您尝试链接,而它找不到foo,那么您将得到一个错误。对于像printf这样的库函数,一些编译器包含它们的内置声明,这样它们就可以进行一些基本的类型检查,所以当隐式声明(从使用中)与内置声明不匹配时,您将得到一个警告。
打开App,查看更多内容
随时随地看视频慕课网APP