在1989 ANSI C标准之前,C没有原型(函数声明指定参数的类型);这些旧式的声明和定义都是可用的。
1989年,ANSI C标准(实质上成为1990年ISO C标准)引入了原型。如果我没有记错,这个想法实际上来自C++(当时还没有被标准化)。旧式声明和定义仍然合法,因此旧代码仍可编译。 1989年的标准还表示,旧式声明“过时”,这意味着它们可以在未来版本的标准中删除。
1999年的ISO C标准(正式)取代了1990年的标准,仅此而已;旧式的声明和定义仍然合法,所有符合要求的编译器都必须支持它们(尽管它们可以自由警告它们,因为它们可以警告其他任何事情)。
截至latest C201X draft(大PDF),这仍然并没有改变。旧式函数声明和定义仍然是该语言的必需部分,所有符合的编译器都必须支持它们。 (就我个人而言,我认为这是不幸的)。另一方面,C++从来没有支持除原型之外的其他功能声明; Stroustrup不关心如何保持与旧C代码的兼容性。
但除非您需要维护非常旧的代码和/或使用非常旧的编译器,否则没有理由使用旧式函数声明或定义。
需要注意的是,至少在C,这样的定义:
int main() {
/* ... */
}
实际上是一个旧式定义。这是正确的C++,它是表明main
没有参数的原型,但在C应该是
int main(void) {
/* ... */
}
(C++也接受这种形式与C兼容性 - 但当时你写main
,您应该已经决定使用哪种语言。)
您不应该随意将C代码编译为C++。如果您需要使用C++代码,您可以将代码链接在一起,并告诉您的C++代码使用C-linkage('extern“C”')。 – jamesdlin 2010-04-30 11:26:04
我记得第一次看到这个语法,大概是1982年。我以为这是蜜蜂的膝盖! (在FORTRAN之后,很多东西看起来像蜜蜂的膝盖。) – TonyK 2011-09-07 21:55:02