为了真正符合标准,C 中的所有函数(除 main 之外)都必须有原型吗?即使它们仅在同一翻译单元中定义后才使用?
这取决于您所说的“真正符合标准”是什么意思。然而,简短的答案是“确保所有函数在使用之前在范围内都有原型是一个好主意”。
一个更合格的答案指出,如果函数接受变量参数(特别是printf()
函数族),那么原型必须在严格符合标准的范围内。对于 C89(来自 ANSI)和 C90(来自 ISO;除了节编号之外与 C89 相同)也是如此。但是,除了“varargs”函数之外,返回一个int
不必声明,并且返回除int
确实需要一个显示返回类型的声明,但不需要参数列表的原型。
但请注意,如果函数采用在没有原型的情况下受到“正常提升”的参数(例如,采用char
or short
- 两者都转换为int
;更严肃地说,也许,一个函数需要float
代替double
),那么就需要一个原型。该标准对此很宽松,以允许旧的 C 代码在符合标准的编译器下进行编译;编写较旧的代码并不是为了确保函数在使用前被声明 - 并且根据定义,较旧的代码不使用原型,因为在有标准之前它们在 C 中才可用。
C99 不允许“隐式 int”...这意味着像“这样的奇怪情况”static a;
' (an int
默认情况下)以及隐式函数声明。 ISO/IEC 9899:1999 的前言中提到了这些内容(以及大约 50 个其他主要更改),
将该标准与以前的版本进行比较:
ISO/IEC 9899:1990,§6.3.2.2函数调用 stated:
如果函数调用中括号内的参数列表前面的表达式包含
仅包含一个标识符,如果该标识符没有可见的声明,则该标识符是隐式的
完全就像在包含函数调用的最里面的块中声明:
extern int identifier();
appeared.38
38 That is, an identifier with block scope declared to have external linkage with type function without
parameter information and returning an int
. If in fact it is not defined as having type “function
returning int
,” the behavior is undefined.
1999 年标准中缺少该段落。我(还)没有追踪允许的措辞变化static a;
在 C90 中并且不允许它(要求static int a;
)在 C99 中。
请注意,如果函数是静态的,则可以在使用之前定义它,并且前面不需要声明。如果定义非静态函数时前面没有声明(-Wmissing-prototypes
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)