哪些 C++ 特性影响了/源自于 C 语言特性?

8

有哪些特性在现行的C标准中并非原本的C语言特性,而是在/为了C++而发明的,并因其优势而后来被采用到C语言中呢?

一个著名的例子就是单行注释//,它最初来源于C++,后来被C语言采纳。

你知道哪些现行的C标准特性是明确或隐含地来源于C++开发的?

信息: 当然,我知道C++源于C,但我只是想知道哪些特性是从派生语言C++的开发中采用的。


4
我相信 C 的 _Bool 类型是受到了 C++ 的 bool 类型的启发。 - Jesper Juhl
2
能够在函数中除了顶部以外的其他位置声明变量也是C++首创,后来被C语言采纳。 - Jesper Juhl
2
我记得函数原型来自C++。 - Ian Abbott
2
不允许将“implicit int”作为函数返回类型(除了main())也是C++开创并随后被C采纳的一项特性。 - Jesper Juhl
5
这似乎不是一个有明确答案的问题,也没有明显的问题。 - Caleb
显示剩余7条评论
2个回答

4

我无法确认它们是否直接受到C++的影响1,但下面是C99中增加的标准C++特性列表:

  • 单行注释(如上所述)
  • 内联函数
  • 允许在块开始后定义变量
  • 布尔数据类型
  • 复杂数学库

C11:

  • 匿名联合体(C11也允许匿名结构体)。匿名联合在标准C++中已经存在。(标准C++仍不允许匿名结构体。)

1例如,BCPL是B语言的前身,而B语言又是C语言的前身,已经有了单行注释的相同语法。在它们被纳入标准C++之前,其中一些可能已经以语言扩展的形式支持在某些C实现中。在这些情况下,标准C和标准C++可能都受到了相同来源的影响,而不是彼此影响。


1
@KonradRudolph 匿名联合体:union named { struct { int i;}; }; 无名联合体:union named { struct { int i;} unnamed; };。未命名的结构体没有名称,但有一个命名变量。匿名结构体没有名称,也没有命名变量。 - eerorika
1
@Konrad https://dev59.com/N2Yq5IYBdhLWcg3wui_F#14248127 - Lightness Races in Orbit
1
在C++出现之前,GCC和其他编译器中就已经存在内联函数了。 - Lee Daniel Crocker

2
“Attributes” 在 C++11 中被添加,在下一个 C 标准修订版“C2x”中也将被添加。这个特性的提案(和此处)明确引用了 C++。

属性可以用于提供信息,例如帮助编译器发出更好的诊断或优化生成的代码。来源

例子:
int [[attr1]] i [[attr2, attr3]];

[[attr4(arg1, arg2)]] if (cond)

{
    [[vendor::attr5]] return i;
}

在这个例子中,"属性attr1适用于变量i的类型,属性attr2和attr3适用于变量本身,属性attr4适用于if语句,vendor::attr5适用于return语句。" 来源


有趣,然而“将被添加”并不保证。 - chux - Reinstate Monica

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