一般来说,C代码被认为是C++代码。
但从严格意义上讲,C不是C++的一个合适的子集。有几个例外情况。
以下是在C中有效但在C++中无效的一些内容:
int *new;//<-- new is not a keyword in C
char *p = malloc(1024); //void * to char* without cast
还有更多的例子,但你已经明白了。
我之前在一个类似的问题中写过一个更详尽的答案,在这里。
需要注意的是,C99新增了一些特性,在C++中不被允许(或只能使用供应商扩展来支持),例如内置的_Complex
和_Imaginary
数据类型、可变长数组(大小在运行时而非编译时确定的数组)、灵活数组成员(作为结构体的最后一个成员声明的数组,可以包含未指定数量的元素)等。
有关C与C++之间不兼容的详尽列表,包括C99的更改,请参见http://david.tribble.com/text/cdiffs.htm。
以下是更多内容:
C允许对main函数进行递归调用,而C++不允许。
char foo[3] = "abc"
在C中是合法的,但在C++中不合法。
sizeof('A') == sizeof(int)
在C中为真,在C++中为假。
C99还有更多变化。
编辑: 我找到了一篇文章,列出了大部分的差异。 http://c-faq.com/misc/cplusplus.nr.html
C不是C++的子集的原因总结如下:
在日常开发中,有一点区别是链接和函数名混淆。使用C编译器编译的C函数不可被C++访问,除非将原型标记为extern "C"
。
还有一些在C中有效但在C++中无效的东西:
int func();
func(0,0); //Error in C++, but not in C
同时不要低估C++拥有更多关键字的影响:
int new; //Obviously an error in C++
typedef struct {
int a, b, c;
} st;
st s = {
.a = 1,
.b = 2,
};
这是有效的C代码,在大多数C++编译器中无法编译。据我所知,它不是C++规范的一部分。然而,一些C++编译器对语言的某些部分很“自由”,允许他们不应该允许的事情,就像很多编译器忽略了规范中几个几乎不使用的细节。
我认为更准确的说法是 ANSI C 是 C++ 的一个子集,而不是 K&R C。
另请参阅是否真的不需要学习C,因为C++包含了一切。 C和C++有很大的共同子集; C++中有许多C中没有的扩展; C中有一些位是C++中没有的(主要是你不想使用的位); 还有一些位在C和C++中都存在,但是不同。