为了真正符合标准,C中的所有函数(main除外)都必须有一个原型,即使它们只在同一翻译单元中定义之后才使用?
发布于 2013-08-24 06:33:20
原型是指定函数参数类型的函数声明。
在ANSI C之前(1978年第一版Kernighan &Ritchie的“C编程语言”所描述的语言)没有原型;函数声明不可能描述参数的数量或类型。这取决于调用者传递正确数量和类型的参数。
ANSI C引入了“原型”,即指定参数类型的声明(这是从早期C++中借用的特性)。
从C89/C90 ( ANSI和ISO标准描述同一种语言)开始,在没有可见声明的情况下调用函数是合法的;提供了隐式声明。如果隐式声明与实际定义不兼容(例如,调用sqrt("foo")
,则行为是未定义的。这种隐式声明和非原型声明都不能与变量函数兼容,因此对变量函数(如printf
或scanf
)的任何调用都必须有一个可见的原型。
C99删除了隐式声明。任何没有可见声明的函数调用都是违反约束的,需要进行编译器诊断。但是该声明仍然不需要是原型;它可以是不指定参数类型的旧式声明。
C11在这一领域没有做出重大改变。
因此,即使在2011年的ISO C标准中,旧式的函数声明和定义(自1989年以来已经“过时”)仍然允许在一致性代码中使用。
对于追溯到1989年的所有C版本,作为风格问题,几乎没有理由不对所有函数使用原型。保留旧式声明和定义只是为了避免破坏旧代码。
发布于 2009-01-12 08:39:17
不,函数并不总是需要原型。唯一的要求是一个函数在使用之前必须被“声明”。声明函数有两种方法:编写原型,或编写函数本身(称为“定义”)。定义总是一个声明,但不是所有的声明都是定义。
发布于 2015-09-06 18:20:54
在编写新函数时,一个很好的技巧是在底部使用main颠倒地编写它们,这样当您改变对函数的参数或返回类型的看法时,您不必同时修复原型。不断修复原型,并在编译器的警告过期时处理它们,变得非常单调乏味。
一旦您的函数一起顺利地工作,将代码移动到一个名称良好的模块,并将原型放在一个同名的.h文件中。它节省了大量的时间。这是我在5年内发现的最大的生产力辅助工具。
https://stackoverflow.com/questions/434763
复制相似问题