首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C89、C90或C99中的所有函数都需要原型吗?

C89、C90或C99中的所有函数都需要原型吗?
EN

Stack Overflow用户
提问于 2009-01-12 08:09:42
回答 5查看 13.1K关注 0票数 50

为了真正符合标准,C中的所有函数(main除外)都必须有一个原型,即使它们只在同一翻译单元中定义之后才使用?

EN

回答 5

Stack Overflow用户

发布于 2013-08-24 06:33:20

原型是指定函数参数类型的函数声明。

在ANSI C之前(1978年第一版Kernighan &Ritchie的“C编程语言”所描述的语言)没有原型;函数声明不可能描述参数的数量或类型。这取决于调用者传递正确数量和类型的参数。

ANSI C引入了“原型”,即指定参数类型的声明(这是从早期C++中借用的特性)。

从C89/C90 ( ANSI和ISO标准描述同一种语言)开始,在没有可见声明的情况下调用函数是合法的;提供了隐式声明。如果隐式声明与实际定义不兼容(例如,调用sqrt("foo"),则行为是未定义的。这种隐式声明和非原型声明都不能与变量函数兼容,因此对变量函数(如printfscanf)的任何调用都必须有一个可见的原型。

C99删除了隐式声明。任何没有可见声明的函数调用都是违反约束的,需要进行编译器诊断。但是该声明仍然不需要是原型;它可以是不指定参数类型的旧式声明。

C11在这一领域没有做出重大改变。

因此,即使在2011年的ISO C标准中,旧式的函数声明和定义(自1989年以来已经“过时”)仍然允许在一致性代码中使用。

对于追溯到1989年的所有C版本,作为风格问题,几乎没有理由不对所有函数使用原型。保留旧式声明和定义只是为了避免破坏旧代码。

票数 18
EN

Stack Overflow用户

发布于 2009-01-12 08:39:17

不,函数并不总是需要原型。唯一的要求是一个函数在使用之前必须被“声明”。声明函数有两种方法:编写原型,或编写函数本身(称为“定义”)。定义总是一个声明,但不是所有的声明都是定义。

票数 14
EN

Stack Overflow用户

发布于 2015-09-06 18:20:54

在编写新函数时,一个很好的技巧是在底部使用main颠倒地编写它们,这样当您改变对函数的参数或返回类型的看法时,您不必同时修复原型。不断修复原型,并在编译器的警告过期时处理它们,变得非常单调乏味。

一旦您的函数一起顺利地工作,将代码移动到一个名称良好的模块,并将原型放在一个同名的.h文件中。它节省了大量的时间。这是我在5年内发现的最大的生产力辅助工具。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/434763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档