C代码仍然被认为是C ++吗?
对这个答案的评论让我感到疑惑。 我一直认为C是C ++的一个合适的子集,也就是说,任何有效的C代码都是有效的C ++代码。 我错了吗? 是否可以编写一个无效的C ++代码的有效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 ++中不允许的几个function(或仅使用供应商扩展支持),例如内置_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中为true,在C ++中为false
C99还有更多变化
编辑:我找到了一篇列出大部分差异的post。 http://c-faq.com/misc/cplusplus.nr.html
为什么C不是C ++的正确子集的总结:
- 从
void *
自动转换为任何对象/不完整类型 - 新关键字(其中一些)
- 由于
struct
s成为范围 - 由于
struct
标签变成了typedef
- 由于需要原型
- 隐式
int
规则 - 递归调用
main
- 由于
//
评论 - 由于字符文字是
char
类型而不是int
等。
将两者分开并在日常开发中出现的一件事是链接和function名称修改。 除非原型标记为extern "C"
否则C ++无法访问使用C编译器编译的AC函数。
其他一些有效的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 ++中但是不同。