C++为什么不能成为C的严格超集?

28

1
这个问题已经被回答了1000次,我想看到一个技术性的答案,证明除了关键字和C99之外,它根本不可能... - Matt Joiner
1
@Matt Joiner:为什么要抛开C99? - JeremyP
1
@Matt:展示什么是不可能的?当然,每个C程序都可以重构为有效的C++。鉴于两种语言都是图灵完备的,这相当简单。 - Konrad Rudolph
1
@Konrad:这几乎是微不足道的,但并非完全如此。C是图灵完备的,并且还提供对文件系统的访问。它的计算模型的输出与图灵模型的输出不同。一个假设的语言,虽然是图灵完备的,但不提供对文件系统的访问,将不是C的超集,从“可以重构”的意义上来说。但是因为C++提供了对所有C库和易失性内存的访问,所以我们在I/O得分方面看起来很好。 - Steve Jessop
5个回答

57

房间里的大象:以下是有效的C语言代码,但不是有效的C++代码。

int typename = 1;

替换您喜欢的C++保留字。


14
最简单的例子是 int new = 1; - SheetJS

24

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

int array[n];

C语言中有效,但在C++中无效。以上代码的C++版本如下:

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

3
我会用 std::vector<int> 替换 new int[]delete[] - fredoverflow
4
@notJim: 是的,array 将会在栈上分配。如果 n 太大了,那么如果你很幸运的话,实现会由于信号(或其他操作系统驱动因素)而终止。如果你不幸的话,实现将盲目地继续破坏其他人的内存。这取决于操作系统/编译器。 - Steve Jessop
1
这不是在C++中应该采用的方法。 - Martin York
2
@FredOverflow:是的,那就是符合C++习惯用法的。 - Andreas Magnusson
1
g++ 允许这样做。非常 hacky,我在大学时用过它。 - basil
显示剩余3条评论

13

有一个特殊的维基条目,总结了许多问题。


9

举个简单的例子,考虑以下声明:

int f();

这是有效的C代码,但无效的C++代码:f(3, 2, -5, "wtf"); 解释:在C中,int f() 被视为 int f(...)(至少在第一次调用时)。如果您不想让函数f接受参数,请声明为 int f(void)

5
不,int f()int f(...)并不完全一样,它们之间有很大的语义差别。在第一种情况下,这意味着我不知道该函数的参数,在首次遇到函数调用时,使用默认类型作为参数声明函数的签名,随后的调用必须遵守这个隐式原型,并且如果你使用其他参数调用该函数,编译器应该会发出警告。而对于带省略号的情况,每次调用都可以使用不同的参数而不会被警告。 - Patrick Schlüter
1
@tristopia:无论是什么,这真的是一个“不要这样做”的事情。 - Alexandre C.
当然,我只是在挑剔,因为有一个真正但微妙的区别。话虽如此,我没有对您的贡献进行投票否决,因为主要信息是正确的。 - Patrick Schlüter

3

我能想到的一个例子是,C++不支持默认的int类型。


在C语言中,除了C99之前的版本,不允许使用隐式返回类型。 - Antti Haapala -- Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接