Bri*_*ndy 26
C++语言说它们是相同的:
int C = 0;
assert(C++ == C);
Run Code Online (Sandbox Code Playgroud)
简而言之,C希望成为一种"便携式汇编语言".它保持简单,让你做几乎直接映射到底层硬件的东西,并没有提供很多高级抽象(你有功能和......就是这样)
C++试图成为一切.高级语言,低级语言,面向对象语言,多范式语言,系统编程语言,嵌入式编程语言和应用程序开发语言.
除了一些共享语法之外,这两种语言并没有太多共同之处.AC程序可能只编译为C++,只有很小的改动,但它与为该语言编写的"适当的"C++代码没有任何共同之处.
这是一个显示c和c ++之间"不兼容"的网站:
http://david.tribble.com/text/cdiffs.htm#C++-vs-C
实际上有很多领域c和c ++分歧(除了类,模板,异常等).
至于主要差异,这里列出了一个很好的清单:
C++主要是C的一个扩展。C++最初被称为“C with classes ”,突出了主要的原始语言扩展。那时已经支持函数的重载。从那时起,C++ 获得了异常、分层命名空间、模板形式的泛型编程以及最后的多线程支持。由于C ++ 11有也是一些最小核心语言支持垃圾回收使用例如贝姆垃圾收集器. 较小的扩展包括引用类型、尾随函数返回类型语法、可以覆盖的内存分配和释放机制、运行时类型信息等。
C 和 C++ 之间的差异,即 C 和 C++ 的“C 子集”之间的差异,在 C++11 标准的标题为“兼容性”的附录 C 中进行了总结,该附录大约有 20 页,其中 C1 部分属于C 兼容性大约是 10 页。
在 C++98 和 C++03 中也是附录 C,在新的 C++14 标准中也是附录 C。
截至该标准的 C++11 附录 C 列出了 C 和 C++ 之间的以下不兼容性:
新关键字(第 2.12 节)
该段落仅参考 C++11 §2.12。以下列表是根据该表和 C99 中的相应表生成的。
C99 C++11 _布尔 _复杂的 _假想 对齐 对齐 汇编 自动 自动 布尔值 休息 休息 案例案例 抓住 字符 字符 char16_t char32_t 班级 常量常量 const_cast 常量表达式 继续 继续 声明类型 默认 默认 删除 渡渡鸟 双双 dynamic_cast 别的 别的 枚举 枚举 明确的 出口 外部外部 错误的 浮动浮动 对于为 朋友 转到转到 如果如果 内联 整数 长长的 可变的 命名空间 新的 没有例外 空指针 操作员 私人的 受保护 民众 注册 注册 reinterpret_cast 严格 返回 返回 短 短 签字 签字 大小大小 静态 静态 静态断言 static_cast 结构体 开关开关 模板 这个 线程本地 扔 真的 尝试 类型定义类型定义 类型标识 类型名称 工会 工会 未签名 未签名 使用 虚拟的 空虚 挥发性 挥发性 wchar_t 一会儿一会儿
字符文字类型从 更改int
为char
(第 2.14.3 节)
制作的字符串文字const
(第 2.14.5 节)
C++ 没有“暂定定义”(第 3.1 节)。
Astruct
是 C ++ 中的范围,而不是 C (第 3.3 节)。
显式声明为 const 而未显式声明的文件范围的名称extern
具有内部链接,而在 C 中它将具有外部链接($3.5)。
main
不能递归调用,也不能获取其地址(第 3.6 节)。
C 在几个地方允许“兼容类型”,C++ 不允许(第 3.9 节)。
转换void*
为指向对象的类型需要强制转换(第 4.10 节)。
只有指向非易失性const
和非易失性对象的指针可以隐式转换为void*
(第 4.10 节)。
不允许隐式声明函数(第 5.2.2 节)。
类型必须在声明中声明,而不是在表达式中(第 5.3.3 节、第 5.4 节)。
条件表达式、赋值表达式或逗号表达式的结果可能是左值(第 5.16 节、第 5.17 节、第 5.18 节)。
现在跳过带有显式或隐式初始化程序的声明是无效的(除非跨未输入的整个块)(第 6.4.2 节,第 6.6.4 节)
现在从声明返回值而不实际返回值的函数返回(显式或隐式)是无效的(第 6.6.3 节)。
在 C++ 中,static
或extern
说明符只能应用于对象或函数的名称。在 C++(第 7.1.1 节)中将这些说明符与类型声明一起使用是非法的。
C++typedef
名称必须与在同一范围内声明的任何类类型名称不同(除非typedef
是同名类名称的同义词)(第 7.1.3 节)。
const
对象必须在 C++ 中初始化,但可以在 C 中保持未初始化(第 7.1.6 节)。
int
C++ 中没有隐式(第 7.1.6 节)。
该关键字auto
不能用作存储类说明符(第 7.1.6.4 节)。
枚举类型的 C++ 对象只能分配相同枚举类型的值(第 7.2 节)。
在 C++ 中,枚举器的类型是它的枚举(第 7.2 节)。
在 C++ 中,使用空参数列表声明的函数不接受任何参数 ($8.3.5)。
在 C++ 中,不能在返回类型或参数类型中定义类型(第 8.3.5 节、第 5.3.3 节)。
在 C++ 中,函数定义的语法不包括“旧式”C 函数(第 8.4 节)。
在 C++ 中,当用字符串初始化字符数组时,字符串中的字符数(包括终止符'\0'
)不得超过数组中的元素数(第 8.5.2 节)。
在 C++ 中,类声明将类名引入到声明它的作用域中,并在封闭作用域中隐藏该名称的任何对象、函数或其他声明(第 9.1 节、第 7.1.3 节)。
在 C++ 中,嵌套类的名称是其封闭类的本地名称(第 9.7 节)。
在 C++ 中,typedef
名称在类定义中使用后不得在类定义中重新声明(第 9.9 节)。
隐式声明的复制构造函数和隐式声明的复制赋值运算符不能复制volatile
左值(第 12.8 节)。
是否__STDC__
已定义,如果已定义,其值是什么,都是实现定义的(第 16.8 节)。
为了简化比较关键字表的重新生成,并建立对给定表的信心,以下是用于生成它的 C++ 程序:
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
#define ITEMS_OF( c ) c.begin(), c.end()
enum class Language { c, cpp };
auto compare( Language const a, Language const b )
-> int
{ return int( a ) - int( b ); }
struct Keyword
{
string word;
Language language;
friend
auto operator<( Keyword const& a, Keyword const& b )
-> bool
{
if( int const r = a.word.compare( b.word ) ) { return (r < 0); }
return (compare( a.language, b.language ) < 0);
}
};
void add_words_from(
string const& filename, Language const language, vector< Keyword >& words
)
{
ifstream f( filename );
string word;
while( getline( f, word ) )
{
words.push_back( Keyword{word, language} );
}
}
auto main() -> int
{
vector< Keyword > words;
add_words_from( "kwc.txt", Language::c, words );
add_words_from( "kwcpp.txt", Language::cpp, words );
sort( ITEMS_OF( words ) );
int const w = 20;
int previous_column = -1;
string previous_word = "";
cout << left;
for( Keyword const& kw : words )
{
int const column = (int) kw.language;
int const column_advance = column - (previous_column + 1);
if( column_advance < 0 || previous_word != kw.word )
{
cout << endl;
if( column > 0 ) { cout << setw( w*column ) << ""; }
}
else
{
cout << setw( w*column_advance ) << "";
}
cout << setw( w ) << kw.word;
previous_column = column; previous_word = kw.word;
}
cout << endl;
}
Run Code Online (Sandbox Code Playgroud)