这是一个有效的C代码,但不是有效的C ++代码?

时间:2010-04-30 09:34:31

标签: c++ c visual-c++

在某些我正在使用的库中(用C语言编写)

StorePGM(image, width, height, filename)
char *image;
int width, height;
char *filename;
{
  // something something
}

所有功能都是这样定义的。我一生中从未见过这样的功能定义。它们似乎对MSVC有效,但当我将其编译为C ++时,它会产生错误。

这是什么?某种旧版本的C?

3 个答案:

答案 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)

是的,它是K& R-Style。 (Kernighan& Ritchie是C的发明者)另见http://www.lysator.liu.se/c/bwk-tutor.html这种前ANSI风格的例子。