What prevents C++ from being a strict superset of C?

Mik*_*ike 23 c c++

Possible Duplicate:
"C subset of C++" -> Where not ? examples ?

我知道C++不是C的严格超集.什么语言特性阻止C++成为C的超集?

Kon*_*lph 47

房间里的大象:以下是有效的C但不是有效的C++.

int typename = 1;
Run Code Online (Sandbox Code Playgroud)

替换你最喜欢的C++保留字.

  • 为什么这个被贬低? (6认同)
  • 最短的例子是`int new = 1;` (6认同)

Ale*_*rty 21

C++也不支持可变长度数组,其中:

int array[n];
Run Code Online (Sandbox Code Playgroud)

在C中有效,但在C++中无效.以上的C++版本将是:

int *array = new int[n];
  ...
delete [] array;
Run Code Online (Sandbox Code Playgroud)

  • @notJim:是的,`array`将在堆栈上分配.如果`n`太大,那么如果你很幸运,实现会因信号(或其他操作系统驱动的制裁)而终止.如果你运气不好,那么实施就会盲目地诋毁别人的记忆.取决于OS /编译器. (3认同)
  • 我会用`std :: vector <int>`替换`new int []`和`delete []`. (2认同)
  • @FredOverflow:是的,这是惯用的 C++。 (2认同)

Jen*_*edt 11

有一个特殊的wiki条目,总结了很多问题.


Ale*_* C. 8

简单的例子,考虑这个声明:

int f();
Run Code Online (Sandbox Code Playgroud)

这是有效的C,但无效的C++: f(3, 2, -5, "wtf");

说明:在C中,int f()被视为int f(...)(至少在第一个调用站点).声明int f(void)好像你不想f参数.

  • 不,`int f()`实际上不是`int f(...)`,它有很大的语义差异.在第一种情况下,这意味着我不知道该函数的参数,并且在第一次遇到函数调用时,用作参数的默认类型声明了该函数的签名,后续调用必须遵循该隐式原型并且如果你用其他参数调用该函数,编译器应该发出警告.对于椭圆而言并非如此,每次调用都可以在没有警告的情况下使用不同的参数. (5认同)