我知道C和C ++是不同的语言,但是当我学习C ++时,总是被告知C是C ++的子集,或者C ++是带有类的C。直到出现C ++ x0,C ++ 11(或总体上是现代C ++ 11/14/17),情况才如此。实际上(特别是在嵌入式系统上工作时),很可能会找到用C ++编写的代码,但是很多部分完全是用纯C语言编写的。这里我有几个问题:


我应该停止使用术语C / C ++吗?
如果#1的答案是肯定的,那么我将如何调用一个使用C和C ++混合的程序?编译器停止支持用C语言编写的代码(因为现代C ++在诸如指针,动态内存处理等基本内容方面与C思维方式有所出入)
现在制定C标准的人们之间是否存在任何协作/ C ++以保持兼容性
如果#4是,那么这种合作可能会在不久的将来随着现代c ++的出现而终止(11/14/17)

我知道已经存在类似的问题,但是我敢肯定,很多人都会分享这些问题,因此我非常有兴趣获得良好的答案,尤其是在不久的将来与C ++趋势有关的观点。

评论

直到C ++ x0出现,C ++ 11否,C89都不是C ++ 98的子集,这才是事实。

我应该停止使用术语C / C ++吗?是。这仅由招聘人员和人力资源部使用。工程师将使用术语C或C ++作为独立语言。如果您发现有一个混用术语的工程师,请避免使用它们。

@LokiAstari:真的吗?我猜SQLite开发人员是人事,因为他们没有空缺职位。这是一个令人难以置信的限制性观点(请像您所处情况中的其他观点那样去否定我的回答)。

@greyfade:很难假设任何地方的任何人都可以声明一个常见字符序列。 “ C / C ++”可能是为某种语言选择的名称,但这并不意味着“ C / C ++”的使用指的是该语言,这比我复制该网站并用“ C / C ++”替换“ C / C ++”更重要。关于C ++标准草案的所有讨论都将突然使用错误的术语“ C ++ 1z”。简而言之,字符串“ C / C ++”从未引用过名为“ C / C ++”的玩笑语言。
@TomDworzanski,stroustrup.com/bs_faq.html#C-is-subset“从严格的数学意义上讲,C并不是C ++的子集...但是,C ++支持C支持的所有编程技术...不是很少能在几小时内将成千上万行C转换为C样式的C ++,因此C ++是ANSI C的超集,就像ANSI C是K&R C的超集,而ISO C ++一样1985年,它是C ++的超集。写得好的C也往往是合法的C ++。例如,Kernighan&Ritchie中的每个示例:“ C编程语言(第二版)”也是C ++程序。”

#1 楼

C从来不是C ++的子集。最明显的例子是int new;。自C89和C ++ 98以来,这就是事实,随着新标准的出现,语言之间的距离仅进一步扩大。
是的

如果#1的答案是肯定的,我将如何调用使用C和C ++混合的程序?一种或另一种语言。一个程序可以包括来自多种语言的代码,这些代码可以一起工作,也可以包含通过链接不同的编译对象而生成的可执行文件。您可能会说程序是用C和C ++编写的,“ C / C ++”不是语言。用C语言编写的支持代码




他们从未这么做过。 char *a = malloc(10);。 C和C ++至少从没有ISO标准开始就没有完全兼容(我不知道有关预标准化日期的所有详细信息)。单击链接或查看下面的文件,该文件适用于C89及更高版本,但在任何C ++标准下均无效。


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的说明。

评论


Objective-C经过专门设计,是C的严格超集,没有冲突的语法和完全正交的对象系统。这是极端的,您实际上可以使用“ Objective-C”的“ Objective”部分并将其附加到其他语言上,从而创建例如目标MODULA-2。最著名的是Apple的Objective-C ++,它具有两个完全正交,非交互,非集成的对象系统。

–‐Jörg W Mittag
15年9月30日在21:30

@masonwheeler,如果OP要查看C的实际超集是什么样子。

– xhainingx
2015年9月30日在22:05

“源文件是用一种或另一种语言编写的。”告诉我的程序,它可以干净地编译为标准C99和C ++ 89。两种语言都不是另一种语言的子集,但两种语言的交集被广泛地作为目标。参见Lua等。

–丰富
2015年10月1日,0:42

@munificent我可以编写也可以通过javac运行的C ++代码,但是那有什么用呢?

– xhainingx
2015年10月1日,0:48

@munificent IOCCC 1986的applin.c条目是可以使用三种语言(C,/ bin / sh和f77)编译的程序的示例。根据您的定义,标记C / Fortran / sh很有意义现在?! ioccc.org/years-spoiler.html#1986。

– Sjoerd
2015年10月1日,凌晨1:03

#2 楼

这些术语如此频繁地结合在一起是有原因的。虽然您不应该告诉C老师他的语言是C ++的子集,但这里有一些道理。其他人已经暴露了您老师的观点。这非常好(并通过示例等进行了说明)。但是我们不住在象牙塔或书本中。

您的大老板根本不在乎您使用的确切语言。如果他对编程有所了解,只需告诉他您使用C / C ++,这听起来就像“我使用了一种需要编译为带有DLL和所有复杂内容的机器代码的语言”。这是“外部通信”部分。

如果您创建一个可以同时使用C和C ++进行接口的库,则肯定要将其称为C / C ++库。当然,有人会举起手来,问您为什么不将它称为恰好具有C ++包装器的C库,反正C ++可以链接到C库,因此您根本不需要提及它。只需回答:“是的,您是对的,这是C / C ++库”。这是“内部通信”部分。

如果您为C ++创建词法分析器,您会惊讶于它与C的配合效果。您甚至可能不需要全部修改。这是“如果它看起来像鸭子等”。部分。

等等。我见过的大多数C程序都无需修改即可作为C ++代码进行编译(和工作)。不要让一些例外情况或教条主义(但是有影响力的)程序员愚弄您的直觉。 C和C ++如此紧密,并且经常兼容,并且经常混合和匹配在一起,因此使用了术语C / C ++。之所以使用它,是因为它对描述这种情况非常有用,只要您使用的不是Java或PHP,无论您考虑使用C还是C ++,这些情况都无关紧要。我们知道这是“错误的”,但是我们不在乎,它比错误更有用。

它可能会被滥用,可能是愚蠢的,但是仍然,我不确定通过过于than脚的学问和拒绝以他人理解的方式进行交流会给您带来什么好处。如果您在某些特定情况下感到不舒服,那就不要使用通用术语C / C ++,而要使用与情况相关的术语(C或C ++)。

不要害怕未来。我们的操作系统是用C编写的。当前许多C / C ++软件生产都使用C ++。这对夫妇在这里住了一段时间。没有人会感兴趣的是使一个与另一个不兼容(实际上相反)。

要具体说明您的观点:

1)这要视情况而定。是的,当它可能导致混乱,感到不安,或者仅仅是错误或不合上下文时。

2)不适用


4 )不知道

5)我不这样认为,因为没有什么可以推动这个方向

评论


评论已删除,因为它们越来越吵。

–ChrisF♦
2015年10月1日19:52

为什么这么多投票?它充满了不准确和虚假的主张!

– Zabis
2015年10月5日13:07

@Zaibis您是否足够友善地解释哪些主张是错误的或不正确的?

–用户号
2015年10月5日14:10

按照您的逻辑,C / C ++ / Objective-C / Fortran / Pascal应该是有效的表达式,但这听起来很愚蠢。术语C / C ++的问题在于它可能意味着几件事,因此您无法保证它会符合所需的含义。在我的实践中,人们通常将其理解为“ C只是C ++的原始版本”,这是错误的。

–martinkunev
2015年10月5日在22:05

除了该术语的固有有效性之外,C / C ++还不是很明确,因此没有用。按照您的示例,C / C ++库可以表示具有C ++包装器的C库,也可以表示具有C包装器的C ++库。或可能意味着该库由几个模块组成,一些模块使用C ++编译,某些模块使用C编译。这一点还不清楚。对我来说,说用C和C ++编写的库要清楚得多,或者说与C ++兼容的C库也要清楚得多。而这里的歧义只有两种语言,请想象一下使用这种“交流策略”获得更多...

–很棒
2015年10月6日15:02

#3 楼

与流程相反,我会说这取决于上下文。

当说“这是一个C / C ++程序”之类的东西时,术语“ C / C ++”通常不合适在其他答案中进行了深入探讨。

但是,在某些情况下,C / C ++可能是合适的。 C和C ++ API。我想如果您将这样的事情称为C / C ++库,那与事实相差不远。我们人类喜欢压缩信息,因此说“ opencv是一个C / C ++库”是简短,清晰且易于理解的,与说“ opencv是一个库,它带有C和C ++的标头”相比较。
您可以谈论语言设计和语法。从语言语法的角度来看,您可能会说一种语言具有类似C / C ++的语法。
您组织一次编码竞赛,并且接受用C和C ++编写的解决方案。
您正在招聘新的程序员,并且大多数任务将是C或C ++,因此,程序员应该会两种语言。这在嵌入式开发中很常见,其中C更适合于某些(通常非常小的)微控制器,而C ++更适合于其他微控制器。在这种情况下,您可能会说您正在寻找C / C ++程序员。


评论


我认为这种立场与P.SO上的普遍共识背道而驰。 (在这里,您必须对看起来像“敏捷/炒作/像唯一和正确的事物”一样的事物进行投票,对其余的事物进行投票)像往常一样受欢迎。伙计们,编程不是一种信仰,而且这个网站也不是一本神圣的书。

–user44761
2015年10月1日,7:50

最后一个要点实际上显示了一个主要问题:您是在寻找(1)认识C或C ++的人,(2)认识C和C ++的人还是(3)困惑于听到这些的人?不同的语言。不要帮助第三个池增长。

– 5gon12eder
2015年10月1日在7:54

如果您真正要寻找的是最后一个要点,最好用“具有C和C ++经验的程序员”表示。标题为“程序员”的求职者广告,根据需要的经验列出了“ C和C ++”或“ C或C ++”,与标题为“程序员”的人并没有明显不同,并列出了“ C / C ++”作为必要的资格,但这是更确切地说。您正在寻找这类工作的人类型可能会非常欣赏这种表达的准确性。

–用户
2015年10月1日在10:58



在书面语言中,“ /”通常被解释为逻辑或非逻辑异或。因此,它要么是其中之一,要么是两者兼而有之。在工作清单中,您知道C或C ++或两者。现在,我觉得很多人都对该词保持虔诚。一个好的C程序员可以很好地选择C ++,而不必考虑两种语言的不同。我开始编写PHP代码,然后转到Scala(两种完全不同的语言),为什么C程序员不能使用C ++,反之亦然?如果在正确的上下文中使用C / C ++术语,则具有一定的优势。

– ILikeTacos
2015年10月1日在16:51



您也可以使用C / C ++来描述旨在被编译为C或C ++的程序,或者具有单独的C和C ++组件的程序。

–user253751
2015年10月1日在21:05



#4 楼


通常,SO用户会问提出问题的人选择一种语言:C或C ++。为什么?


C和C ++之间有许多细微的区别。例如,在C ++中,除非声明const,否则全局范围内的extern变量具有内部链接,而在C中,除非声明static,否则它具有外部链接。通过说“ C / C ++”,OP宣称知道他们的问题的答案在C和C ++中是相同的,而实际上可能不是。这不必要地使想成为答题者的事情变得更加困难。反对在C ++中无效)。真烦人当您拥有一段在C中有效但在C ++中无效的代码时,为什么要说“ C / C ++”?您打算使用C,还是这只是打算使用C ++的代码中的错误?
有时,答案因语言而异(例如,C99中存在可变长度数组,但C ++中不存在可变长度数组)。如果我们不知道您在说什么语言,要么必须猜测,要么在只有一种实际有用的情况下为两种情况都写一个答案,因为您知道您实际上在使用哪种语言。您只是不告诉我们!
有时候两种语言的答案确实相同,但是很难确定。例如,我认为C和C ++具有相同的整数转换规则,但是为了真正确定,我必须仔细阅读这两个标准。同样,当您只关心一种语言时,这使我的工作量增加了两倍。

无论如何,回答您的其他问题:


是的。
如果将C和C ++代码链接在一起,可以同时使用两个标记,但是请指定每个文件使用的语言。
有时会有重大更改,但它们很少见,而且影响力通常有限(否则,它们不会获得批准)。例如,C ++ 11中的void*
我不认为他们直接合作,但他们关注另一种语言的开发,并尝试避免引入会使兼容性变得更加困难的更改。
如果您确实想了解两种语言,那很好,您可以在问题中说出来。当您说“ C / C ++”时,我真的不确定您的意思,而且看起来您好像正在对这两种语言进行假设。

评论


我知道有人在C和C ++的交集中编写代码,并使用C ++编译器进行类型检查,但使用C编译器进行代码生成。不过,我不知道这是否真的有意义。但是,这是每两年在Linux Kernel Mailinglist上出现的一个话题,当时有人提交了一个补丁以将(在Linux Kernel的统一对象导向驱动程序模型中非常重要)结构类重命名为struct klass那个原因,然后总是被Linus击落。

–‐Jörg W Mittag
15年9月30日在21:36

@JörgWMittag:我从未见过有人使用“ C / C ++”作为“ C和C ++的通用子集”的简写,并且也知道他在说什么。故意在公共子集中工作的人倾向于通过不缩写来使之明确。

–巴特·范·恩根·舍瑙(Bart van Ingen Schenau)
2015年10月1日,7:01

特别是有关在Stack Exchange问​​题中使用C / C ++的问题,这是一个很好的答案,而不是一般而言。

–user253751
2015年10月1日在21:15

@BartvanIngenSchenau您遇到了几个性病委员会成员?

–好奇
19年5月9日下午4:34

#5 楼


我总是被告知C是C ++的子集,或者C ++是带有类的C。直到C ++ x0,C ++ 11(或现代的C ++ 11/14/17)出现之前,这都是安静的事实。 C ++。例如,C89不是C ++ 98的子集。

一些示例:


C ++不支持函数参数声明的C89标识符列表形式。
C89和C ++ 98具有字符常量的不同类型
C89和C ++ 98的字符串文字具有不同的类型
逻辑运算符在C89和C ++ 98中产生不同的类型(intbool



我应该停止使用C / C ++吗?



是的。



如果#1的答案是肯定的,那么我该如何调用使用C和C ++的程序?



程序是C还是C ++ (如果甚至某些非常基本的程序也可以使用C或C ++编译器进行编译)。您使用什么编译器进行编译?它应该回答您的问题。 Harbison&Steele创造了术语Clean C来表示C和C ++的一个常见子集,但我认为这是一个坏主意。

编辑:但是,我承认从技术上讲,您可以在单个程序中链接C和C ++对象文件,但是OTH允许在单个程序中混合使用多种语言,例如Java和C ++。我认为使用术语“ C / C ++程序”只会使人们更加困惑,因为它是用一种称为C / C ++的单一语言编写的。不同的语言很可能在某些时候C ++编译器停止支持用C语言编写的代码(因为现代c ++在诸如指针,动态内存处理等基本内容方面与C思维方式有所出入)



C99或C11具有许多C ++版本不支持的功能(例如:可变长度数组,灵活数组成员,_Generic等)。

评论


关于多语言程序:广泛使用JNI的程序可以称为C / Java程序。两种语言一起使用的事实并不意味着它们是一起编译的。

–user253751
2015年10月1日18:52

stroustrup.com/bs_faq.html#C-is-subset“从严格的数学意义上讲,C并不是C ++的子集...但是,C ++支持C支持的所有编程技术...能够在数小时内将成千上万行C转换为C样式的C ++,因此,C ++是ANSI C的超集,就像ANSI C是K&R C的超集,而ISO C ++是C ++的超集就像它在1985年一样存在。编写良好的C也往往是合法的C ++。例如,Kernighan&Ritchie中的每个示例:“ The C Programming Language(第二版)”也是C ++程序。

–本
2015年10月2日,9:01

@Ben“ C编程语言(第二版)”中的第一个程序(世界),省略了main的返回类型,该返回类型在C ++中无效。

–哇
2015年10月2日在10:19

@ouah,看来Stroustrup教授当时错过了一个:-)注意C11也不允许:-)不过,可以肯定的是,在早期版本的C ++中是允许的。

–本
2015年10月2日,11:11



@ouah,那不是C ++的第一个版本。这本书来自1988年,当时两种语言都不是ISO标准。当时的C ++当前版本是Bjarne Stroustrup于1985年撰写的书。

–本
2015年10月2日,12:30

#6 楼

有些程序是用C和C ++混合编写的。
这确实是事实。您可以从C和C ++编译目标文件并将它们链接在一起。结果可以合理地称为“ C / C ++程序”。
但这只是整个程序。单独的编译单元如何?
有一个C的子集,它也是C ++的一个子集。
用该子集编写的程序(或编译单元)将在一致的C和C ++下编译并表现相同编译器。这样的程序或文件可以正确地称为“ C / C ++程序”或“ C / C ++文件”。
部分程序(例如头文件)也可以在C和C ++程序中使用。这样的头文件可以正确地称为C / C ++头文件。
引用Bjarne Stroustrup教授的话:

C是C ++的子集吗?
从严格的数学意义上讲,C是不是C ++的子集。有些程序是有效的C,但不是有效的C ++,甚至有几种编写在C和C ++中具有不同含义的代码。但是,C ++支持C支持的所有编程技术。每个C程序都可以用相同的方式在C ++中以相同的运行时和空间效率来编写。能够在数小时内将成千上万行ANSI C转换为C样式C ++并不少见。因此,C ++是ANSI C的超集,就像ANSI C是K&R C的超集一样,ISO ++是1985年的C ++超集。例如,Kernighan&Ritchie中的每个示例:“ The C Programming Language(第二版)”也是C ++程序。


http://www.stroustrup.com/bs_faq。 html#C-is-subset

所以是的,有C / C ++之类的东西。它既是有效的C又是有效的C ++。
C预处理程序是C语言的一部分。 C ++预处理器是C ++语言的一部分
您可以编写一个将在C或C ++下进行编译且不同的编译单元。例如,它可能具有用C编译的基本功能,但如果用C ++编译则可以利用C ++库。 。它是相同的,但也有所不同。
大多数C程序员至少可以做一点C ++,反之亦然
将这样的人称为C / C ++程序员并不是没有道理的。是的,他们可能专门研究一种语言,但是有没有人是胜任的C或C ++程序员,而他们实际上不能使用任何其他语言?从某种意义上说,不是所有的C / C ++程序员吗?
说“ C / C ++”没有错。重要的是被理解
英语不是表达三段论的工具。您可以用英语来逻辑,但只能用力而为。
这是因为单词并不自然具有确切的含义,而是含糊不清的内涵和内涵。重要的是人们是否理解您在说什么。

评论


@BЈовић他们对于一小部分术语的可接受性不同意您的意见,因此您得出的结论是,他们不了解其中的区别并且不称职。这是很不合理的事情。

–本
2015年10月1日13:46

@ el.pescado是的。您会发现人们实际上是在指PHP / JavaScript。为什么不?重点是要理解,而不是玩文字游戏。

–本
2015年10月1日13:53

@BЈовић你没有道理。它们不是“完全不同”的。 C ++是比C大得多的语言,但是它几乎包含了所有C。有一些不兼容性会阻止C ++成为适当的超集,但它们很小,就像其他保留字一样,还需要进行一些强制类型转换,但这仅够了。它几乎是一个适当的超集,只是不完全是。

–本
2015年10月1日14:15

@BЈовић也许您不明白我写的是什么。您为什么不看这里,看看在每种情况下如何都可以改编C程序,使其也可以编译为C ++。 david.tribble.com/text/cdiffs.htm#C99-vs-CPP9

–本
2015年10月1日15:22

@BЈовић如果您是个术语专家,您应该意识到C并不是“功能性”的,而是“过程性的”,您可能希望先理解一下这种差异,然后再对别人的无能为由进行指控。

– R.M.
2015年10月1日于16:25

#7 楼



我应该停止使用术语C / C ++吗?





绝对。除了可能会混淆使用C和C ++代表使用该术语的人的含义外,尚不清楚该构造的意图是什么。 ,许多人对此感到非常激动,仅此词的出现就足以使他们对您的贡献持否定态度。这看起来可能很愚蠢,但似乎正是我们所拥有的。 br />

如果您谈论的是C语言中可能不适合C ++的内容,只需说C即可。首先,在C ++中对main函数进行声明吗?但是随着讨论的进行,可能需要指出的是,在C ++中,该函数必须在全局范围内声明,这在C语言中没有意义,因为它没有int main()。另一方面,C允许递归调用int main(int, char**),而C ++不允许。在C ++中,如果您“掉线”了namespace,则存在一个隐式main,但在C语言中,任何路径上都需要return 0;语句。清单继续进行,如果您预先弄清楚要讨论的语言是什么,它就使讨论变得更加简单。只需说一下C ++,对于C可能也可能不正确。


示例:mainreturn ed数组最初在C ++中是否为全零? br /> C的简短答案恰好是相同的:不。但是随着答案的继续,可能值得指出的是,在C语言中,malloc()是一个很好的选择,而在C ++中,使用int可能是一个更好的选择。



如果要指出C和C ++之间的相似之处,请说C和C ++。


示例:在C和C ++中,callocstd::vector<int>是实现定义的,可能在编译器和体系结构之间有所不同。

这里,我们要指出C和C ++的行为方式相同。我们明确地在谈论这两种语言。




我实际上建议您更加具体,不仅要谈论“ C”或“ C ++”,还要谈论确切的版本。两种语言都在发展,诸如


这样的直率语句C ++支持sizeofint注释,而C仅支持/* … */样式。对与错。



如果#1的答案是肯定的,我将如何调用使用C和C ++混合的程序? />

由于语言重叠,每个C程序都会包含看起来像C ++的部分,反之亦然。但是,作者可能会选择使用C或C ++编译器。因此,如果使用C ++编译器编译,则说“用C编写程序”,如果他们使用C ++编译器,则说“用C ++编写程序”,即使他们可能拒绝使用任何现代C ++功能。有些人将此类C ++代码称为C样式C ++。缺少重载,异常,多态性,模板和I / O流是此类代码的共同特征。用C ++编写并用C ++编译器进行编译,然后将目标文件链接在一起,我会说“程序是用C和C ++混合编写的”,实际上,您已经这样做了。 />但是,如果相反,如果作者非常小心地编写每个文件,以便可以使用C或C ++编译器对其进行编译,并且生成的程序将执行相同的操作,则可以说“该程序是用C和C ++的通用子集编写的。”

后者通常是应在C和C ++代码之间共享的头文件的情况。顺便说一句,编写这样的代码并不容易。如果要进一步强调仅使用了在C和C ++中有效且受不同编译器供应商广泛支持的此类构造,则可以使用术语C和C ++的可移植公共子集来强调这一点。



鉴于它们都是“不同的”语言,C ++编译器是否有可能在某些时候停止支持用C语言编写的代码(因为现代C ++与C语言的基本思想有所不同诸如指针,动态内存处理之类的东西?)




我不确定我是否理解这个问题。由于C和C ++是不同的语言,因此您不能期望其中的一个编译器接受为另一个编写的程序。但是,编译器通常以模块化方式进行设计,如果编译器具有C ++前端,则很有可能也会具有C前端。 (然后,您可以通过命令行开关或类似方法选择所需的语言。)只要两种语言都将被广泛使用,这种情况似乎不太可能改变。我认为关于“现代C ++”的观点基本上是关于好的编码标准和标准库的问题。从编译器的角度来看,两种语言的发展都趋于收敛而不是发散。



要保持C ++的兼容性?




是的。 C ++ 11和C11中引入的内存模型和原子操作库就是一个很好的例子。似乎两种语言的设计者都意识到兼容性很重要,并且正在努力改进它。我个人希望合作更加紧密,两个ISO工作组甚至可以参加,但是我的愿望并不重要。

Bjarne Stroustrup在C ++编程语言第4版的第44.3节中谈论了C和C ++的各种版本之间的区别和共性,具有讽刺意味的是,其标题为“ C / C ++兼容性”。在这种情况下,使用该术语实际上可能是适当的,因为它的含义很明显。随着现代C ++的出现(11/14/17)



如上所述,它发生在C ++ 11中,并且有望/希望/需要发生再次。

评论


怎么可能是非非非?

–JDługosz
2015年10月1日在7:48

它没有像“绿色的东西很昂贵”这样的陈述那样具有明确定义的真值。对于C和C ++版本的特定组合,它是正确的,而对于其他版本,它是错误的。

– 5gon12eder
2015年10月1日于7:57

#8 楼

C / C ++是C和C ++的交集。

int new;不是C / C ++,也不是vector<int> foo;

类似地,C89 / C99是这两者的交集不允许使用enum bool { false, true };for(int i = 0;;)的语言。

和C ++ 11 / C ++ 14等。

可以编写编译代码(正确在C ++ 11和C ++ 14下运行),即使在一个编译器下编译并不意味着它在另一个编译器下编译。实际上,很多人都这样做。

很多人编写的代码都可以在C和C ++中使用。制造我不希望看到有关C / C ++ / Java代码的任何问题。


尽管谈论这些语言的常见子集是“合理的”,但许多问题不会在这个子集中有答案,例如main()在C和C ++中应该返回什么?

但是您可以讨论适用于多种语言规范的代码,无论这些规范是通过“版本”还是“语言名称”区分的。 br />

#9 楼

这是对以下一些回答的一种回应:在其他答案和评论中可以看到“这是一个适合工作的程序员的代码,可以在管理环境中使用”。 br />我认为即使是那种解释也应该小心。不得不问他们对面向对象的设计了解多少,他们在面向对象的上下文中进行调试有多少经验,以及他们使用模板库的能力。您想在面试和录用过程中准确地探究那些问题。

另一方面,自C ++专家开始推动“现代C ++”发展至今已有十多年了从裸露的指针转移到更安全的指针对象和基于迭代器的习惯用法。随着C ++ 11的出现,现在已经对多范式编程提供了明确的支持,并且大力推动不显示任何裸指针的代码。这就是说,如果我今天采访了一位C ++程序员以担任C职位,我将非常关心检查这个人对启用脚踩射击的实际指针的熟悉程度。

这些天不从事业务(甚至达到我在Stack Overflow刚起步时的程度),所以我不敢猜测任何一位假想的受访者都不会具备交叉技能,但是我认为由于最常用的语言现在确实已经大不相同了。

评论


指出它是“ C或C ++,谁知道”,“ C和C ++,链接在一起”,“ C和C ++,交点”还是“ C或C ++,谁在乎”的歧义即使人们可以以某种方式摆脱困境,它也越来越缺乏正当性。

–重复数据删除器
2015年10月4日在22:24



#10 楼

这个问题的最简单答案是,您不应该使用该术语。这是一个不应该存在的术语。没有任何意义每个程序都是C或C ++。


直到C ++ x0,C ++ 11(或
现代C ++ 11 /通常是14/17)。


C ++ 98和03甚至都不是带有类的远程C。谁教过你这个都不知道,你可以忘记他们。这永远是不正确的。

评论


这并非完全正确。曾经有一页描述一种名为“ C / C ++”的语言的拟议语言规范,该规范除其他外规定了(几乎)不存在类型系统。遗憾的是,此页面已被删除,托管该页面的网站此后放置了robots.txt文件,该文件删除了archive.org中的存档副本。

– Greyfade
2015年10月1日在6:34

啊哈,我在archive.is上找到了一个副本:基本原理,语法和语义。

– Greyfade
2015年10月1日在6:37

“每个程序都是C或C ++。”我不同意。采取C程序,然后一次将其移植到C ++一个文件中(通过更改一个文件的编译器选项)是很常见的。某些文件可能永远不会移植,并永远保持C状态。这样的程序是用C和C ++编写的

–尼基
2015年10月1日,9:42

并不是的。该程序由子程序组成,每个子程序都是C或C ++。就编译器而言,每个TU(即整个程序)都被编译为C或C ++。

– DeadMG
2015年10月1日在16:17

不是“每个程序都是C或C ++”。 Bjarne Stroustrup教授说:“写得很好的C往往也合法C ++。例如,Kernighan&Ritchie中的每个示例:“ The C Programming Language(第二版)”也是一个C ++程序。 stroustrup.com/bs_faq.html#C-is-subset

–本
2015年10月1日19:16

#11 楼

从概念上讲,设计C源文件没有特别困难,因此它们也可以使用C ++进行原样编译。这样做确实可以带来一些显着的优势。例如,在为嵌入式系统编写代码时,有时能够在托管的PC环境中测试代码会有所帮助。如果代码可以像C ++一样干净地编译,则可能会有类似“ MOTOR_ENABLE = 1;”的语句。写入嵌入式系统上的易失性I / O位(编译为C),但在PC上触发仿真逻辑(编译为C ++)。也有可能在PC上设计C ++类型,其行为将像uint16_t在较小的嵌入式系统上的行为一样(因此,例如,给定u16 x=65533;,编译器将不得不将x*x的值视为9,而不是具有自由愿意做任何想做的事情),尽管到目前为止我的仿真器都没有包含(部分原因是因为我使用的C ++编译器在这种情况下没有做任何古怪的事情)。
C程序员和C ++程序员彼此之间有足够的反感,这些年来,这些语言已经以兼容的方式发展。当C89尝试改编C ++的一些更有用的功能(例如函数原型)时,似乎已经出现了一种态度,即希望C ++的任何功能的程序员都应使用C ++,而忽略了在许多情况下会使用C ++的事实。能够使用C ++的某些功能(例如,使用静态或静态内联链接重载函数的能力,而不必接受与不需要的其他功能相关的成本(例如,与导出相关的名称处理)的功能将很有帮助重载的函数)。

尽管C89和C ++ 98的交集是一种可行的语言,但C的较新版本与C ++的较新版本的可用超集可能会缩小而不是增加(由于严格的别名规则),并且趋势倾向于裂缝越来越大。

评论


什么是“ C ++ 95”?技术报告?

– Ben Voigt
2015年10月2日,0:10

如果要为内部函数重载,但不希望为外部函数重命名,则可以将前者放入匿名名称空间中,并将后者声明为extern“ C”,然后使用C ++编译器。

– 5gon12eder
2015年10月2日,7:26

@BenVoigt:Mea culpa。我应该查一下。 C99之前的C ++版本。当C89推出时,它试图使C更像C ++,但是C99添加了许多C ++绝对不感兴趣的功能(例如可变长度数组)。我用C ++编程的次数不多,但我认为比起各种不同的功能,更多的C ++功能对C的帮助更大。

–超级猫
2015年10月2日,14:57

@ 5gon12eder:我从未尝试将C ++代码链接到C项目。它真的像使所有内容都是静态/内联或外部“ C”一样简单,还是还有其他复杂性(例如,静态对象初始化等)?在C ++中,有什么方法可以使foo(1234)调用foo_const(1234)宏,而foo(x)[x不是常数的话]将调用foo_var(x)函数?在嵌入式代码中,有很多情况可能会使诸如SET_PORT(port,state)之类的“函数”具有三种形式,这取决于端口和状态是否都是...

–超级猫
2015年10月2日15:09

...编译时常量,端口是常量,但状态不是,或者端口和状态都不是常量。有什么方法可以使用模板或其他标准C ++机制来干净地完成此操作,还是只能在具有gcc扩展名的编译器上实现?

–超级猫
2015年10月2日,15:16