C代码仍然被认为是C ++吗?

时间:2008-11-20 01:36:10

标签: c++ c

this answer的评论让我感到疑惑。我一直认为C是C ++的一个合适的子集,也就是说,任何有效的C代码都是有效的C ++代码。我错了吗?是否可以编写一个无效的C ++代码的有效C程序?

编辑:这与this question非常相似,但不完全相同。

8 个答案:

答案 0 :(得分:27)

通常,是的C代码被认为是C ++代码。

但严格意义上说,C不是一个合适的子集。有几个例外。

以下是C中一些在C ++中无效的有效内容:

int *new;//<-- new is not a keyword in C
char *p = malloc(1024); //void * to char* without cast 

还有更多的例子,但你明白了。

我之前在类似问题here中写了更广泛的答案。

答案 1 :(得分:12)

另请注意,C99添加了C ++中不允许的一些功能(或仅使用供应商扩展支持),例如内置_Complex_Imaginary数据类型,可变长度数组(数组)在运行时而不是编译时调整大小,灵活的数组成员(声明为可能包含未指定数量元素的结构的最后一个成员的数组)等等。

有关C和C ++之间不兼容性的详尽列表,包括C99的更改,请参阅http://david.tribble.com/text/cdiffs.htm

答案 2 :(得分:7)

还有一些:

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 ++的正确子集的原因摘要:

  1. void *自动转换为任何对象/不完整类型
  2. 新关键字(其中一些)
  3. 由于struct成为范围
  4. 由于struct代码变为typedef s
  5. 由于需要原型
  6. 隐式int规则
  7. 递归拨打main
  8. 由于//评论
  9. 由于字符文字属于char而非int等。

答案 3 :(得分:5)

其他一些有效的C但不是C ++的东西:

int func();
func(0,0); //Error in C++, but not in C

另外,不要低估C ++拥有更多关键字的影响:

int new;  //Obviously an error in C++

答案 4 :(得分:5)

将两者分开并在日常开发中出现的一件事是链接和功能名称修改。除非原型标有extern "C",否则C ++无法访问使用C编译器编译的C函数。

答案 5 :(得分:2)

typedef struct {
     int a, b, c;
} st;

st s = {
    .a = 1,
    .b = 2,
};

这是有效的C代码,无法在大多数 C ++编译器中编译。据我所知,它不是C ++规范的一部分。然而,一些C ++编译器对语言的某些部分是“自由的”并允许他们不应该做的事情,正如很多人错过了规范中的一些细微差别,但几乎从未使用过。

答案 6 :(得分:1)

我认为说ANSI C是C ++的子集可能更为正确。不是K&amp; R C。

答案 7 :(得分:1)

另见Is it true that there is no need to learn C because C++ contains everything。 C和C ++有一个很大的共同子集; C ++中有很多不在C中的扩展; C中有一些不在C ++中的位(主要是你不想使用的位);并且有些位在C和C ++中但是不同。