首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该停止使用C/C++这个词吗?

我应该停止使用C/C++这个词吗?
EN

Software Engineering用户
提问于 2015-09-30 19:27:57
回答 9查看 23.3K关注 0票数 144

我理解C和C++是不同的语言,但当我学习C++时,我总是被告知C是C++的子集,C++是带类的C。在C++x0,C++11 (或现代C++ 11/14/17 )出现之前,这是相当真实的。事实上(尤其是在嵌入式系统上),很可能会找到用C++编写的代码,但是很多部分都是用纯C语言编写的。这里我有几个问题:

  1. 我应该停止使用C/C++这个词吗?
  2. 如果对#1的回答是肯定的,我将如何调用一个混合使用C和C++的程序?
  3. 鉴于这两种语言都是“不同的”语言,那么C++编译器是否有可能在某一时刻停止支持用C语言编写的代码(因为现代c++在指针、动态内存处理等基本内容上偏离了C思维)
  4. 现在制定C/C++标准的人之间有没有合作来保持兼容性?
  5. 如果#4是肯定的,这种合作可能在不久的将来随着现代c++ (11/14/17)的出现而结束。

我知道已经有类似的问题了,但我相信很多人都有相同的问题,所以我非常有兴趣得到好的答案,特别是那些与C++趋势有关的问题。

EN

回答 9

Software Engineering用户

回答已采纳

发布于 2015-09-30 19:32:57

C不是C++的一个子集。这方面最明显的例子是int new;。自从C89和C++98之后,这是真的,随着新标准的出现,语言之间的距离也越来越大。

我是否应该停止使用C/C++这个术语?

如果对#1的回答是肯定的,我将如何调用一个混合使用C和C++的程序?

源文件用一种或另一种语言编写。程序可以由多种语言共同工作的代码组成,也可以由链接不同编译对象生成的可执行文件组成。你会说程序是用C和C++编写的,"C/C++“不是一种语言。

鉴于这两种语言都是“不同的”语言,那么在某种程度上,C++编译器是否可能停止支持用C语言编写的代码?

  1. 他们从来没做过。char *a = malloc(10);CC++从来没有完全兼容过,至少只要他们有国际标准化组织的标准(我不知道标准化前的所有细节)。单击链接或查看下面所示的文件,该文件适用于C89和up,但在任何C++标准下都无效。
  2. afaik没有,但我对C工作组不太了解。
代码语言:javascript
复制
/* 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的子集。

票数 188
EN

Software Engineering用户

发布于 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)我不这么认为,因为没有什么东西能推动这个方向

票数 109
EN

Software Engineering用户

发布于 2015-10-01 06:15:33

相反,我要说,这取决于上下文。

当说“这是一个C/C++程序”时,术语"C/C++“通常是不合适的,但在其他答案中已经深入探讨了这一点。

然而,在某些情况下,C/C++可能是合适的。

  • 有各种各样的库,它们通常同时具有C和C++ API。如果你把这样的东西叫做C/C++库的话,我想这离事实也不远了。我们人类喜欢压缩信息,所以说"opencv是一个C/C++库“是简短、清晰和易懂的,与之相比,"opencv是一个库,它附带了C和C++的头”。
  • 您可以讨论语言设计和语法。从语言语法的角度来看,您可以说语言具有C/C++ -like语法。
  • 您组织一次编码竞赛,并且接受用C编写的和用C++编写的两种解决方案
  • 您正在雇用一个新的程序员,大部分任务要么是C,要么是C++,所以程序员应该知道这两种语言。它在嵌入式开发中很常见,C更适合于一些(通常是非常小的)微控制器,而C++则更适合于其他微控制器。在这种情况下,您可能会说您正在寻找一个C/C++程序员。
票数 44
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/298665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档