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

10

对于这个答案的评论让我开始思考。我一直认为C是C++的一个子集,也就是说,任何有效的C代码在扩展到C++时都是有效的C++代码。我的想法是否正确?是否有可能编写一个有效的C程序但不是有效的C++代码?

编辑:这与此问题非常相似,但并非完全重复。


Bill,我修改了另一个问题的主题,因为该主题并不代表这个问题。 - Brian R. Bondy
我认为你是正确的。问题的目的(以及给出的答案)足够不同,可以保持开放状态。 - Bill the Lizard
8个回答

27

一般来说,C代码被认为是C++代码。

但从严格意义上讲,C不是C++的一个合适的子集。有几个例外情况。

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

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

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

我之前在一个类似的问题中写过一个更详尽的答案,在这里


从技术上讲,它们可以一起编译(如上所述)。但是在C++文件中编写C代码(也称为带类的C)并不意味着它是C ++。每种语言的风格都非常不同,从C到C ++就像学习一门新语言。从C ++转向C只会带来太多痛苦。 - Martin York

12

需要注意的是,C99新增了一些特性,在C++中不被允许(或只能使用供应商扩展来支持),例如内置的_Complex_Imaginary数据类型、可变长数组(大小在运行时而非编译时确定的数组)、灵活数组成员(作为结构体的最后一个成员声明的数组,可以包含未指定数量的元素)等。

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


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. 由于结构体成为作用域限定符
  4. 由于结构体标记成为typedefs
  5. 由于需要原型
  6. 隐式int规则
  7. 对main函数的递归调用
  8. 由于//注释
  9. 由于字符字面值的类型是char而不是int等

有趣的是,我不知道这三个中的所有内容。你有关于C++不允许递归调用main函数的参考资料吗?如果我添加-pedantic标志,g++才会抱怨它。 - Adam Rosenfield
我找不到相关的参考资料,但我记得在 comp.lang.c 论坛上,当人们寻求 C/C++ 帮助时,这种情况经常发生,这引起了老手们的愤怒和喊叫:“它们是不同的语言!” - Roland Rabien
1
请注意,//在C99中是允许的 - 这是当前的C标准。 - Jonathan Leffler

5

在日常开发中,有一点区别是链接和函数名混淆。使用C编译器编译的C函数不可被C++访问,除非将原型标记为extern "C"


5

还有一些在C中有效但在C++中无效的东西:

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

同时不要低估C++拥有更多关键字的影响:

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

我非常确定你的第一个例子是错误的。Comeau编译器会拒绝它。如果你提供了参数列表,那么你必须遵守它。如果你将参数列表留空,那么你可以传递任何想要的参数。 - Rob Kennedy

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

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

这是有效的C代码,在大多数C++编译器中无法编译。据我所知,它不是C++规范的一部分。然而,一些C++编译器对语言的某些部分很“自由”,允许他们不应该允许的事情,就像很多编译器忽略了规范中几个几乎不使用的细节。


我认为编译器接受这个的原因是如果你打开了C99兼容标志,或者没有关闭它。 - Robert Gould

1

我认为更准确的说法是 ANSI C 是 C++ 的一个子集,而不是 K&R C。


1
K&R C是非标准C(K&R第一版)的口语术语。 - Jonathan Leffler

1

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