Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这是有效的C代码,但不是有效的C++;密码?_C++_C_Visual C++ - Fatal编程技术网

C++ 这是有效的C代码,但不是有效的C++;密码?

C++ 这是有效的C代码,但不是有效的C++;密码?,c++,c,visual-c++,C++,C,Visual C++,在某些库中,我使用(用C编写)它的 所有函数都是这样定义的。我一生中从未见过这样的函数定义。它们似乎对MSVC有效,但当我将其编译为C++时,它会给出错误。 这是什么?某种旧版本的C?是的。K&R,预标准C。避免使用它。是的,这是K&R风格。(Kernighan和Ritchie是C的发明者)参见此前ANSI风格的示例。在1989年ANSI C标准之前,C没有原型(指定参数类型的函数声明);这些旧式的声明和定义是所有可用的 1989年,ANSI C标准(基本上成为1990年的ISO C标准)引入了

在某些库中,我使用(用C编写)它的

所有函数都是这样定义的。我一生中从未见过这样的函数定义。它们似乎对MSVC有效,但当我将其编译为C++时,它会给出错误。
这是什么?某种旧版本的C?

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

是的,这是K&R风格。(Kernighan和Ritchie是C的发明者)参见此前ANSI风格的示例。

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

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

1999年的ISO C标准(正式)取代了1990年的标准,没有考虑这一点;旧式的声明和定义仍然是合法的,所有符合标准的编译器都必须支持它们(尽管它们可以自由地警告它们,因为它们可以警告任何其他东西)

截至(大PDF),这一点仍然没有改变。旧式的函数声明和定义仍然是语言的必需部分,所有符合要求的编译器都必须支持它们。(我个人认为这很不幸) 另一方面,C++除了作为函数声明的原型外,从未(?)支持任何东西;Stroustrup并不关心如何保持与旧C代码的兼容性

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

请注意,至少在C中,此定义:

int main() {
    /* ... */
}
这实际上是一个老式的定义。C++是正确的,它是一个原型,它指示<代码>主< /代码>没有参数,但是在C中应该是< /p>
int main(void) {
    /* ... */
}

(为了与C兼容,C++也接受这种形式——但在您编写
main
时,您应该已经决定使用哪种语言了。)

Kernighan与C的发明无关。是的,他们还建议不要在新项目中使用它,因为这本书已经出版了第三版。@Alex——K&R《C编程语言》的第三版,这是C程序员的圣经。从很久以前开始,当整个语言可以在大约100页(至少在第一版)内充分解释时,它仍然是标准的;C90和C99仍然支持旧式函数定义,即使是最新的C201X草案也没有删除它们。就我个人而言,我认为这很不幸。(注意我不是不同意,它是标准的,它也恰好是标准的)你不应该任意编译C代码作为C++。如果你需要用C++代码使用它,你可以把代码链接起来,告诉C++代码使用C链接(<代码>外)C“< /代码>”。我记得第一次看到这个语法,大约1982。我还以为是蜜蜂的膝盖呢!(FORTRAN之后,很多东西看起来像蜜蜂的膝盖。)
int main(void) {
    /* ... */
}