Bri*_*ndy 26
C++语言说它们是相同的:
int C = 0;
assert(C++ == C);
简而言之,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 节)。
intC++ 中没有隐式(第 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;
}