我理解C和C ++是不同的语言但是当我学习C ++时,我总是被告知 C是C ++的一个子集或者C ++是带有类的C。直到C ++ x0,C ++ 11(或者现代C ++ 11/14/17)的出现,这才是真实的。事实上(特别是在处理嵌入式系统时),它很可能会找到用C ++编写的代码,但很多部分完全用纯C语言编写。在这里,我有几个问题:
我知道已经有类似的问题了,但我确信很多人都有这些疑惑,所以我非常有兴趣专门针对与C ++趋势有关的问题得到好的答案在不久的将来。
答案 0 :(得分:4)
我总是被告知C是C ++的一个子集,或者C ++是带有类的C。在C ++ x0,C ++ 11(或者现代C ++ 11/14/17)出现之前,这一点很安静。
C从未成为C ++的子集。例如,C89不是C ++ 98的子集。
一些例子:
int
vs bool
)
- 我应该停止使用术语C / C ++吗?
醇>
是
- 如果对#1的回答是肯定的,我如何调用使用C和C ++混合的程序?
醇>
程序是C或C ++(即使某些非常基本的程序可以使用C或C ++编译器编译)。你用什么编译器来编译它?它应该回答你的问题。哈比森&斯蒂尔创造了术语Clean C来指定C和C ++的共同子集,但我认为这是一个坏主意。
编辑:但我承认,从技术上讲,您可以在单个程序中链接C和C ++对象文件,但是有许多语言允许在单个程序中混合,例如Java和C ++ 。我认为使用术语C / C ++程序只会增加混淆,因为它是用一种叫做C / C ++的语言编写的。
- 鉴于它们都是“不同”的语言,很可能在某些时候C ++编译器停止支持用C语言编写的代码(因为现代c ++偏离了C语言的基本内容,如指针,动态内存处理,等)
醇>
任何C ++版本都不支持C99或C11的许多功能(例如:可变长度数组,灵活数组成员,_Generic
,...)。
答案 1 :(得分:4)
C从来都不是C ++的子集。最明显的例子是int new;
。自从C89和C ++ 98以来,这种情况一直如此,随着新标准的出现,语言之间的关系也越来越远。
我应该停止使用术语C / C ++
是
如果对#1的回答是肯定的,我如何调用使用C和C ++混合的程序?
源文件用一种语言或另一种语言编写。程序可以包含多种语言协同工作的代码,也可以包含链接不同编译对象的可执行代码。你会说这个程序是用C和C ++编写的," C / C ++"不是一种语言。
3)他们从未这样做过。鉴于他们两个都是不同的'语言很可能在某些时候C ++编译器停止支持用C语言编写的代码
int *a = malloc(10);
。 C和C++早已分道扬..单击链接或查看下面的C89及以上版本的文件,但在任何C ++标准下都无效。
4)afaik不,工作组相互了解,但标准做出了最适合自己的决定。
/* A bunch of code that compiles and runs under C89 but fails under any C++ */
/* type aliases and struct names occupy separate namespaces in C, not in C++ */
struct S { int i; };
typedef int S;
struct Outer { struct Inner { int i; } in; };
/* struct Inner will be Outer::Inner in C++ due to name scope */
struct Inner inner;
/* default return type of int in C, C++ functions need explicit return types */
g() {
return 0;
}
/* C sees this as two declarations of the same integer,
* C++ sees it as redefinition */
int n;
int n;
/* K&R style argument type declarations */
void h(i) int i; { }
/* struct type declaration in return type */
struct S2{int a;} j(void) { struct S2 s = {1}; return s; }
/* struct type declaration in argument, stupid and useless, but valid */
/*void dumb(struct S3{int a;} s) { } */
/* enum/int assignment */
enum E{A, B};
enum E e = 1;
void k() {
goto label; /* C allows jumping past an initialization */
{
int x = 0;
label:
x = 1;
}
}
/* () in declaration means unspecified number of arguments in C, the definition
* can take any number of arguments,
* but means the same as (void) in C++ (definition below main) */
void f();
int main(void) {
f(1); /* doesn't match declaration in C++ */
{
/* new is a keyword in C++ */
int new = 0;
}
/* no stdio.h include results in implicit definiton in C. However,
* as long as a matching function is found at link-time, it's fine.
* C++ requires a declaration for all called functions */
puts("C is not C++");
{
int *ip;
void *vp = 0;
ip = vp; /* cast required in C++, not in C */
}
return 0;
}
/* matches declaration in C, not in C++ */
void f(int i) { }
我总觉得值得一提的是C 是Objective-C的一个子集。
答案 2 :(得分:2)
一般来说,SO用户会询问提出问题的人选择语言:C或C ++。为什么呢?
C和C ++之间存在许多细微差别。例如,在C ++中,全局范围内的const
变量具有内部链接,除非声明为extern
,但在C中它具有外部链接,除非声明为static
。通过说“C / C ++”,OP正在断言他们的问题的答案在C和C ++中是相同的,当它很可能不是时。 这对于那些想成为回答者的事情来说更加不必要。
有时我们可以发现代码在一种语言或另一种语言中无效(例如,从void*
到指向对象的指针的隐式转换在C ++中无效)。这很烦人。当你有一段在C而不是C ++中有效的代码时,为什么要说“C / C ++”?您是否打算使用C,或者这仅仅是C ++代码中的错误?
有时答案会因语言而异(例如,C99中存在可变长度数组但C ++中不存在)。如果我们不知道你在说什么语言,要么我们必须猜测,要么在只有一个实际有用的时候为两者写一个答案,因为你知道你实际使用的是哪种语言;你只是没有告诉我们!
有时两种语言的答案确实相同,但很难确定。例如,我认为C和C ++具有相同的整数转换规则,但为了真正,非常确定,我必须仔细阅读这两个标准。同样,当你可能只关心其中一种语言时,这使我做了两倍的工作。
无论如何,要回答你的其他问题:
是
如果要将C和C ++代码链接在一起,则可以同时使用这两个标记,但请指定每个文件所在的语言。
有时会发生重大变化,但它们很少见且影响有限(否则它们不会获得批准)。例如,C ++ 11中的auto
。
我不认为他们直接合作,但他们会关注其他语言的发展,并尽量避免引入会使兼容性更加困难的更改。
如果你真的想知道这两种语言,那很好,你可以在你的问题中说出来。当你说“C / C ++”时,我真的不确定你的意思,看起来你真的在假设这两种语言。