在某些我正在使用的库中(用C语言编写)
StorePGM(image, width, height, filename)
char *image;
int width, height;
char *filename;
{
// something something
}
所有功能都是这样定义的。我一生中从未见过这样的功能定义。它们似乎对MSVC有效,但当我将其编译为C ++时,它会产生错误。
这是什么?某种旧版本的C?
答案 0 :(得分:16)
是。 K& R,预标准C.避免使用它。
答案 1 :(得分:5)
在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
时,你应该已经决定使用哪种语言。)
答案 2 :(得分:0)