我理解C和C++是不同的语言,但当我学习C++时,我总是被告知C是C++的子集,C++是带类的C。在C++x0,C++11 (或现代C++ 11/14/17 )出现之前,这是相当真实的。事实上(尤其是在嵌入式系统上),很可能会找到用C++编写的代码,但是很多部分都是用纯C语言编写的。这里我有几个问题:
我知道已经有类似的问题了,但我相信很多人都有相同的问题,所以我非常有兴趣得到好的答案,特别是那些与C++趋势有关的问题。
发布于 2015-09-30 19:32:57
C不是C++的一个子集。这方面最明显的例子是int new;。自从C89和C++98之后,这是真的,随着新标准的出现,语言之间的距离也越来越大。
我是否应该停止使用C/C++这个术语?
是
如果对#1的回答是肯定的,我将如何调用一个混合使用C和C++的程序?
源文件用一种或另一种语言编写。程序可以由多种语言共同工作的代码组成,也可以由链接不同编译对象生成的可执行文件组成。你会说程序是用C和C++编写的,"C/C++“不是一种语言。
鉴于这两种语言都是“不同的”语言,那么在某种程度上,C++编译器是否可能停止支持用C语言编写的代码?
char *a = malloc(10);。C和C++从来没有完全兼容过,至少只要他们有国际标准化组织的标准(我不知道标准化前的所有细节)。单击链接或查看下面所示的文件,该文件适用于C89和up,但在任何C++标准下都无效。/* 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是目标C的子集。
发布于 2015-09-30 23:03:17
这些术语之所以如此频繁地出现,一定有其原因。虽然你不应该告诉你的C老师他的语言是C++的一个子集,但这里有一些事实。其他人已经暴露了你老师的观点。这是非常好(并举例说明,等等)。但我们不是住在象牙塔里,也不是书里。
你的大老板对你所用的语言毫不在意。如果他对编程有一点了解,只要告诉他你使用了C/C++,这听起来就像“我使用了一种语言,需要编译成机器代码,带有all和所有复杂的东西”。这就是“对外交流”的部分。
如果您创建一个可以同时由C和C++进行接口的库,那么您肯定希望将它称为C/C++库。当然,有人会举手,问你为什么不把这个叫做C库,因为它恰好有一个C++包装器,而且无论如何,C++可以链接到C库,所以你根本不需要提到它。回答:“是的,你是对的,这是一个C/C++库”。这就是“内部沟通”的部分。
如果您为C++创建了一个词法分析器,那么它在C中的工作效果会让您感到惊讶。您甚至可能不需要全部修改它。这就是“如果它看起来像鸭子,等等”。部分。
等。
我见过的大多数C程序都没有经过修改就编译(工作)为C++代码。不要让少数例外或教条主义(无论多么有影响力)程序员欺骗你的直觉。C和C++是如此接近,而且常常是兼容的,而且经常是混合和匹配在一起的,所以使用了术语C/C++。之所以使用它,是因为描述这类情况非常有用,因为不管您考虑的是C还是C++,只要不是Java或PHP,这些情况都不重要。我们知道这是“错误的”,但我们不在乎,它比错误更有用。
它可能被滥用,它可能是愚蠢的,但我仍然不知道你会得到什么好处,因为你比需要更迂腐,拒绝以别人理解的方式进行交流。如果您在某些特定情况下感到不安,那么就不要使用通用术语C/C++,而是使用与情况相关的术语(C或C++)。
不要害怕未来。我们的操作系统都是用C编写的,很多C/C++当前的软件生产都是在C++中进行的。这对夫妇要在这里待一段时间。没有人有兴趣让其中一种与另一种更不相容(实际上恰恰相反)。
具体地讲你的观点:
1)视情况而定。是的,当它可能导致混乱,当你感到不安,或当它是错误的或脱离上下文。不,当你认为它足够的时候。
2)北/阿
我想没有,但我没有水晶球。
4)不知道
5)我不这么认为,因为没有什么东西能推动这个方向
发布于 2015-10-01 06:15:33
相反,我要说,这取决于上下文。
当说“这是一个C/C++程序”时,术语"C/C++“通常是不合适的,但在其他答案中已经深入探讨了这一点。
然而,在某些情况下,C/C++可能是合适的。
https://softwareengineering.stackexchange.com/questions/298665
复制相似问题