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

cla*_*aws 9 c c++ visual-c++

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

StorePGM(image, width, height, filename)
char *image;
int width, height;
char *filename;
{
  // something something
}
Run Code Online (Sandbox Code Playgroud)

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

它是什么?某种旧版C?

Ale*_*ski 16

是.K&R,标准前C.避免使用它.

  • 是的,他们还建议自本书第三版以来不在新项目中使用它. (2认同)

Kei*_*son 5

在1989 ANSI C标准之前,C没有原型(指定参数类型的函数声明); 这些旧式的声明和定义都是可用的.

1989年,ANSI C标准(基本上成为1990 ISO C标准)引入了原型.如果我没记错的话,这个想法实际上来自C++(当时还没有标准化).旧式声明和定义仍然合法,因此旧代码仍然可以编译.1989年的标准还说旧式声明是"过时的",这意味着它们可以在未来版本的标准中删除.

1999年的ISO C标准(正式)取代了1990年的标准,仅此一项; 旧式声明和定义仍然是合法的,并且所有符合要求的编译器必须支持它们(尽管它们可以自由地警告它们,因为它们可以警告其他任何事情).

截至最新的C201X草案(大型PDF),这仍然没有改变.旧式函数声明和定义仍然是语言的必需部分,所有符合条件的编译器都必须支持它们.(就个人而言,我认为这很不幸.)

另一方面,C++从未(?)支持除原型之外的任何函数声明; Stroustrup并不关心如何保持与旧C代码的兼容性.

但除非您需要维护非常旧的代码和/或使用非常旧的编译器,否则没有充分的理由使用旧式函数声明或定义.

注意,至少在C中,这个定义:

int main() {
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

实际上是一种旧式的定义.它对C++来说是正确的,它是一个原型,表明它main没有参数,但在C中它应该是

int main(void) {
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

(C++也接受这种形式与C兼容 - 但是当你写作时main,你应该已经决定使用哪种语言.)