2010-04-30 117 views
9

在我使用了一些库(C语言编写)的这是一个有效的C代码,但不是有效的C++代码?

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

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

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

+1

您不应该随意将C代码编译为C++。如果您需要使用C++代码,您可以将代码链接在一起,并告诉您的C++代码使用C-linkage('extern“C”')。 – jamesdlin 2010-04-30 11:26:04

+0

我记得第一次看到这个语法,大概是1982年。我以为这是蜜蜂的膝盖! (在FORTRAN之后,很多东西看起来像蜜蜂的膝盖。) – TonyK 2011-09-07 21:55:02

回答

16

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

+2

是的,他们也建议自本书第三版以来不要在新项目中使用它。 – tunnuz 2010-04-30 09:47:02

+0

@tunnuz,*第三版*第三版是什么? – 2010-04-30 09:49:16

+1

@Alex - K&R的“The C Programming Language”第三版,C程序员的圣经。 – QuantumPete 2010-04-30 09:56:17

0

是的,这是K & R型。 (Kernighan & Ritchie是C的发明者)另请参阅http://www.lysator.liu.se/c/bwk-tutor.html以获取此ANSI之前的样式示例。

+6

Kernighan与C.的发明无关。 – 2010-04-30 09:43:40

+0

不知道这个事实,谢谢。无论如何他共同撰写了关于C的第一本书... – MartinStettner 2010-04-30 09:58:25

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 ,您应该已经决定使用哪种语言。)