【问题标题】:What prevents C++ from being a strict superset of C? [duplicate]是什么阻止了 C++ 成为 C 的严格超集? [复制]
【发布时间】:2010-09-23 09:36:40
【问题描述】:

可能重复:
“C subset of C++” -> Where not ? examples ?

我知道 C++ 不是 C 的严格超集。哪些语言特性阻止 C++ 成为 C 的超集?

【问题讨论】:

  • 这个问题已经被回答了 1000 次,我希望看到一个技术性的答案,证明这是不可能的,除了关键字和 C99...
  • @Matt Joiner:为什么要把 C99 放在一边?
  • @Matt:证明 what 是不可能的?当然,每个 C 程序都可以重构为有效的 C++。考虑到这两种语言都是图灵完备的,这是相当微不足道的。
  • @Konrad:这几乎是微不足道的,但不完全是。 C 是图灵完备的,并且还提供对文件系统的访问。它的计算模型的输出与图灵模型的输出不同。图灵完备但不提供对文件系统的访问的假设语言不会是“可重构”意义上的 C 的超集。但是因为 C++ 提供对所有 C 库和volatile 内存的访问,所以我们的 I/O 分数看起来不错。

标签: c++ c


【解决方案1】:

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

int typename = 1;

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

【讨论】:

  • 最短的例子是int new = 1;
【解决方案2】:

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

int array[n];

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

int *array = new int[n];
  ...
delete [] array;

【讨论】:

  • 我会将new int[]delete[] 替换为std::vector<int>
  • @notJim: 是的,array 将在堆栈上分配。如果n 太大,那么如果幸运的话,实现会因信号(或其他操作系统驱动的制裁)而终止。如果你不走运,实施会盲目地继续破坏别人的记忆。取决于操作系统/编译器。
  • 不是在 C++ 中你会怎么做。
  • @FredOverflow:是的,这是惯用的 C++。
  • g++ 允许这样做。很hacky,在大学里用过
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    int f();
    

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

    解释:在 C 中,int f() 被视为int f(...)(至少在第一个调用点)。如果不希望f 带参数,则声明为int f(void)

    【讨论】:

    • 不,int f() 并不是真正的int f(...),语义上存在很大差异。在第一种情况下,这意味着我不知道该函数的参数,并且在第一次遇到函数调用时,用作参数的默认类型声明了该函数的签名,后续调用必须遵守该隐式原型和如果您使用其他参数调用该函数,编译器应该发出警告。使用椭圆则不是这样,每次调用都可以有不同的参数而不会发出警告。
    • @tristopia:不管是什么,这真的是不要这样做的事情。
    • 当然,我只是在吹毛求疵,因为存在真实但微妙的差异。这表示我没有否决您的贡献,因为消息主要是好的。
    【解决方案5】:

    我的一个想法 - C++ 不支持默认 int。

    【讨论】:

    • C 中也不允许隐式返回类型,C99 之前除外。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 2017-06-10
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多