这个问题是由对post by Herb Sutter的回复引发的,他在那里解释了MS决定不支持/制作C99编译器,而只是使用C++(11)标准中的C(99)特性.

One commenter replied:

(.)C很重要,至少值得关注一下.

有很多现有的代码是有效的C语言,但不是 有效的C++.该代码不太可能被重写(.)

因为我只用MS C++编程,所以我真的不太了解"纯"C语言,也就是说,我不知道我正在使用的C++语言的哪些细节不是用C(99)编写的,我也几乎不知道哪些C99代码在C++编译器中不能正常工作.

请注意,我知道C99 only restrict关键字,对我来说,它的应用范围非常狭窄,还知道可变长度数组(我不确定它们的广泛程度或重要性).

此外,我非常感兴趣是否有任何重要的语义差异或trap ,即C(99)代码在C++(11)下可以compile,但在C++编译器中与C编译器做一些不同的事情.


快速链接:答案中的外部资源:

推荐答案

如果从C和C++的公共子集开始,有时称为Cead C(这不是C90),则必须考虑3种类型的不兼容性:

  1. Additional C++ featues which make legal C illegal C++

    例如可以在C中用作标识符的C++关键字,或者在C中隐式但需要在C++中显式强制转换的转换.

    这可能是微软仍然提供C前端的主要原因:否则,不能编译为C++的遗留代码将不得不重写.

  2. Additional C features which aren't part of C++

    C语言在C++Forking 后并没有停止演化.例如可变长度数组、指定的初始值设定项和restrict.这些特性可以很方便,但不是任何C++标准的一部分,有些可能永远都无法实现.

  3. Features which are available in both C and C++, but have different semantics

    这方面的一个例子是const个对象或inline个函数的链接.

C99和C++98 can be found here之间的不兼容列表(MAT已经提到过).

虽然C++ 11和C11在一些方面变得更接近(变量宏现在在C++中可用,但是可变长度数组现在是可选的C语言特征),但不兼容性的列表也已经增长(如C中的通用 Select 和C++中的auto类型说明符).

顺便说一下,虽然微软已经采取了一些热来决定放弃C(这不是最近的一个),据我所知,开源社区中没有人真正采取措施来做一些事情:通过C to C++编译器可以提供现代C的许多特性,特别是如果你考虑到some of them are trivial to implement.现在使用Comeau C/C++确实可以做到这一点,它支持C99.

然而,这并不是一个紧迫的问题:就我个人而言,我对在Windows上使用GCC和Clang非常满意,而且MSVC也有专有的替代品,例如Pelles C或Intel的编译器.

C++相关问答推荐

新的memaligning函数有什么用?

Bison解析器转移/减少冲突

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

C指针算法在函数参数中的应用

我应该如何解决我自己为iOS编译的xmlsec1库的问题?转换Ctx.first在xmlSecTransformCtxPrepare()之后为空

以前版本的tty_ldisc_ops.ioctl()是否也需要文件参数?

如何将字符串argv[]赋给C中的整型数组?

为什么sscanf不能正确地从这个字符串格式中提取所有数字?

正确的TCP/IP数据包 struct

Kdb:仅升级指定的列

&;(str[i])和(&;str)[i]有什么区别?

S的这种管道实施有什么问题吗?

OpenSSL:如何将吊销列表与SSL_CTX_LOAD_VERIFY_LOCATIONS一起使用?

类型定义 struct 与简单的类型定义 struct

GCC错误,共享内存未定义引用?

GETS()在C++中重复它前面的行

atoi函数最大长-长误差的再创造

C/C++编译器可以在编译过程中通过按引用传递来优化按值传递吗?

10 个字节对于这个 C 程序返回后跳行的能力有什么意义

malloc 属性不带参数