标题：c++
简介
在C的基础上，一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C++。 C++进一步扩充和完善了C语言，成为一种面向 对象的程序设计语言。C++目前流行的编译器最新版本是Borland C++4.5,Symantec C++6.1,和Microsoft VisualC++ 2012。C++提出了一些更为深入的概念，它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间，为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性，掌握起来有一定难度。
C++由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现（最初这种语言被称作“C with Classes”带类的C）。开始，C++是作为C语言的增强版出现的，从给C语言增加类开始，不断的增加新特性。虚函数（virtual function）、运算符重载（operator overloading）、多重继承（multipleinheritance）、模板（template）、异常（exception）、RTTI、命名空间[1]（name space）逐渐被加入标准。[2]
1998年国际标准组织（ISO）颁布了C++程序设计语言的国[3]际标准ISO/IEC 1988-1998。C++是具有国际标准的编程语言，通常称作ANSI/ISOC++。[4]
  1998年是C++标准委员会成立的第一年，以后每5年视实际需要更新一次标准。C++0x最终国际投票已于2011年8月10日结束，并且所有国家都投出了赞成票，C++0x已经毫无疑义地成为正式国际标准。先前被临时命名为C++0x的新标准将被称为C++ 2011。C++ 2011将取代现行的C++标准ISO/IEC 14882，它公开于1998年并于2003年更新，通称C++98以及C++03。国际标准化组织于2011年9月1日出版发布ISO/IEC 14882:2011，名称是：Information technology -- Programming languages -- C++ Edition: 3。[5-6]
从C到C++
  代码计算机诞生初期,人们要使用计算机必须用机器语言或汇编语言编写程序｡世界上第一种计算机高级语言诞生于1954年,它是FORTRAN语言｡先后出现了多种计算机高级语言｡其中使用最广泛､影响最大的当推BASIC语言和C语言｡
BASIC语言是1964年在FORTRAN语言的基础上简化而成的,它是为初学者设计的小型高级语言｡
C语言是1972年由美国贝尔实验室的D.M.Ritchie研制成功的｡它不是为初学者设计的,而是为计算机专业人员设计的｡大多数系统软件和许多应用软件都是用C语言编写的｡
但是随着软件规模的增大,用C语言编写程序渐渐显得有些吃力了｡
C++是由AT&T Bell(贝尔)实验室的Bjarne Stroustrup博士及其同事于20世纪80年代初在C语言的基础上开发成功的｡C++保留了C语言原有的所有优点,增加了面向对象的机制｡
C++是由C发展而来的,与C兼容｡用C语言写的程序基本上可以不加修改地用于C++｡从C++的名字可以看出它是C的超越和集中｡C++既可用于面向过程的结构化程序设计,又可用于面向对象的程序设计,是一种功能强大的混合型的程序设计语言｡
C++对C的“增强”,表现在六个方面：
（1) 类型检查更为严格。
（2) 增加了面向对象的机制。
（3）增加了泛型编程的机制（template）
（4）增加了异常处理
（5）增加了运算符重载
（6）增加了标准模板库（STL）　　
面向对象程序设计,是针对开发较大规模的程序而提出来的,目的是提高软件开发的效率｡不要把面向对象和面向过程对立起来,面向对象和面向过程不是矛盾的,而是各有用途､互为补充的｡
学习C++,既要会利用C++进行面向过程的结构化程序设计,也要会利用C++进行面向对象的程序设计，更要会利用模板进行泛型编程｡C和C++关系但是，C是C++的基础，C++语言和C语言在很多方面是兼容的。因此，掌握了C语言，再进一步学习C++就能以一种熟悉的语法来学习面向对象的语言，从而达到事半功倍的目的。
C timeline
1978 k&R C---->1988 ANSI C-->1995 ISO C
学习C语言最经典的还是The C Programming Language发展历史C++语言发展大概可以分为三个阶段：第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言，并且凭借着接近C语言的效率，在工业界使用的开发语言中占据了相当大份额；第二阶段从1995年到2000年，这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现，泛型程序设计在C++中占据了越来越多的比重性。当然，同时由于Java、C#等语言的出现和硬件价格的大规模下降，C++受到了一定的冲击；第三阶段从2000年至今，由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现，C++出现了发展历史上又一个新的高峰，这些新技术的出现以及和原有技术的融合，使C++已经成为当今主流程序设计语言中最复杂的一员。[7]
语言特点
优点  C++代码· C++设计成静态类型、和C同样高效且可移植的多用途程序设计语言。 
· C++设计成直接的和广泛的支持多种程序设计风格（程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计）。 
· C++设计成给程序设计者更多的选择，即使可能导致程序设计者选择错误。 
· C++设计成尽可能与C兼容，籍此提供一个从C到C++的平滑过渡。 
· C++避免平台限定或没有普遍用途的特性。 
· C++不使用会带来额外开销的特性。 
· C++设计成无需复杂的程序设计环境。[8]
出于保证语言的简洁和运行高效等方面的考虑，C++的很多特性都是以库（如STL）或其他的形式提供的，而没有直接添加到语言本身里。关于此类话题，Bjarne Stroustrup的《C++语言的设计和演化》（1994）里做了详尽的陈述。　
C++在一定程度上可以和C语言很好的结合，甚至目前大多数C语言程序是在C++的集成开发环境中完成的。C++相对众多的面向对象的语言，具有相当高的性能。
C++引入了面向对象的概念，使得开发人机交互类型的应用程序更为简单、快捷。很多优秀的程序框架包括MFC、QT、wxWidgets就是使用的C++。[9]　代码性能人们一般认为，使用Java或C#的开发成本比C++低。但是，如果充分分析C++和这些语言的差别，会发现这句话的成立是有条件的。这个条件就是：软件规模和复杂度都比较小。如果不超过3万行有效代码（不包括生成器产生的代码），这句话基本上还能成立。否则，随着代码量和复杂度的增加，C++的优势将会越来越明显。造成这种差别的就是C++的软件工程性。[9]　缺点C++由于语言本身过度复杂，这甚至使人类难于理解其语义。更为糟糕的是C++的编译系统受到C++的复杂性的影响，非常难于编写，即使能够使用的编译器也存在了大量的问题，这些问题大多难于被发现。[9]
由于本身的复杂性，复杂的C++程序的正确性相当难于保证。也有人提出不支持多线程的原语等缺陷。不过有如此多的知名人士提出了如此多的缺陷，正说明C++被广泛使用和成功。
c++语言由于过度的复杂性，以及与unix的文化相抵触，在unix/linux领域受到很多著名人士（比如Linux之父linus torvalds与著名黑客Eric S. Raymond）的强烈批评与抵制。[10]
编程技巧
new和delete运算符new和delete提供了存储的动态内存分配和释放功能，它的作用相当于C语言的函数malloc（）和free（），但是性能更为优越。使用new较之使用malloc（）有以下的几个优点： 
（1）new自动计算要分配类型的大小，不使用sizeof运算符，比较省事，可以避免错误。 
（2）自动地返回正确的指针类型，不用进行强制指针类型转换。 
（3）可以用new对分配的对象进行初始化。 [11]inline对于频繁使用的函数，C语言建议使用宏调用代替函数调用以加快代码执行，减少调用开销。但是宏调用有许多的弊端，可能引起不期望的副作用。例如宏：#define abs(a)(a)<0?(-a):(a))，当使用abs(i++)时，这个宏就会出错。 
所以在C++中应该使用inline内联函数替代宏调用，这样既可达到宏调用的目的，又避免了宏调用的弊端。 
使用内联函数只须把inline关键字放在函数返回类型的前面。[11]函数重载在C语言中，两个函数的名称不能相同，否则会导致编译错误。而在C++中，函数名相同而参数数据类型不同的两个函数被解释为重载。
使用函数重载可以帮助程序员处理更多的复杂问题，避免了使用诸如intabs()、fabs()、dabs()等繁杂的函数名称；同时在大型程序中，使函数名易于管理和使用，而不必绞尽脑汁地去处理函数名。同时必须注意，参数数据类型相同，但是函数返回类型不同的两个函数不能重载。[11]参数传递在C语言中，如果一个函数需要修改用作参数的变量值的时候 ，参数应该声明为指针类型；当参数的大小超过一个机器字长时，通过传值方式来传递参数的效率较低，也需要用指针。由于C语言的指针可以进行p++,--p,p+=1等算术运算，所以编译器无法在编译的时候确定指针引用的变量。对于复杂的程序，使用指针容易出错，程序也难以读懂。在C++中，对于上述情况 可以使用引用来代替指针，使程序更加清晰易懂。引用就是对变量取的一个别名，对引用进行操作，这就相当于对原有变量进行操作。[11]缺省参数在C++中函数可以使用缺省参数
通常的情况下，一个函数应该具有尽可能大的灵活性。使用缺省参数为程序员处理更大的复杂性和灵活性问题提供了有效的方法，所以在C++的代码中都大量地使用了缺省参数。 
需要说明的是，所有的缺省参数必须出现在不缺省参数的右边。亦即，一旦开始定义缺省参数，就不可再说明非缺省的参数。否则当你省略其中一个参数的时候，编译器无法知道你是自定义了这个参数还是利用了缺省参数而定义了非缺省的参数。[11]使用STLSTL（Standard Template Library，标准模板库), STL的代码从广义上讲分为三类：algorithm（算法）、container（容器）和iterator（迭代器），并包括一些工具类如auto_ptr。几乎所有的代码都采用了模板类和模板函数的方式，这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
作用符被重载，使得我们可以像访问数组一样访问vector中的元素。[11]使用模板.模板的概念。
模板是C++的一个特性，是函数和类可以作用于不同的类型上而不需要针对每一个具体类型重复相同的代码。与模板相反，我们已经学过的重载(Overloading)，对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如，为求两个数的最大值，我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。[12]如果使用模板就可以只写一个通用的MAX模板，而不需要针对每个类型重复相同的逻辑。
指针与引用的区别
指针与引用看上去完全不同（指针用操作符“*”和“->”，引用使用操作符“&”），但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针，在什么时候使用引用呢？
首先，要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象，但是该变量在某些时候也可能不指向任何对象，这时你应该把变量声明为指针，因为这样你可以赋空值给该变量。相反，如果变量肯定指向一个对象，例如你的设计不允许变量为空，这时你就可以把变量声明为引用。[13]
类和对象
一、类和对象的作用
类是C++中十分重要的概念，它是实现面向对象程序设计的基础。类是所有面向对象的语言的共同特征，所有面向对象的语言都提供了这种类型。一个有一定规模的C++程序是由许多类所构成的。
C++支持面向过程的程序设计，也支持基于对象的程序设计，又支持面向对象的程序设计。以后我们将介绍基于对象的程序设计。包括类和对象的概念、类的机制和声明、类对象的定义与使用等。这是面向对象的程序设计的基础。基于对象就是基于类。与面向过程的程序不同，基于对象的程序是以类和对象为基础的，程序的操作是围绕对象进行的。
在此基础上利用了继承机制和多态性，就成为面向对象的程序设计(有时不细分基于对象程序设计和面向对象程序设计，而把二者合称为面向对象的程序设计)。
基于对象程序设计所面对的是一个个对象。所有的数据分别属于不同的对象。在面向过程的结构化程序设计中，人们常使用这样的公式来表述程序：
程序=算法+数据结构
算法和数据结构两者是互相独立、分开设计的，面向过程的程序设计是以算法为主体的。在实践中人们逐渐认识到算法和数据结构是互相紧密联系不可分的，应当以一个算法对应一组数据结构，而不宜提倡一个算法对应多组数据结构，以及一组数据结构对应多个算法。基于对象和面向对象程序设计就是把一个算法和一组数据结构封装在一个对象中。因此，就形成了新的观念：
对象 = 算法 + 数据结构
程序 = (对象+对象+对象+…) + 消息
或：
程序 = 对象s + 消息
“对象s”表示多个对象。消息的作用就是对对象的控制。程序设计的关键是设计好每一个对象，及确定向这些对象发出的命令，使各对象完成相应操作。 [14]
二、C++类的声明和对象的定义
1、类和对象的关系
每一个实体都是对象。有一些对象是具有相同的结构和特性的。每个对象都属于一个特定的类型。在C++中对象的类型称为类(class )。类代表了某一批对象的共性和特征。前面已说明：类是对象的抽象，而对象是类的具体实例(instance)。
正如同结构体类型和结构体变量的关系一样，人们先声明一个结构体类型，然后用它去定义结构体变量。同一个结构体类型可以定义出多个不同的结构体变量。
在C++中也是先声明一个类类型，然后用它去定义若干个同类型的对象。对象就是类类型的一个变量。可以说类是对象的模板，是用来定义对象的一种抽象类型。类是抽象的，不占用内存，而对象是具体的，占用存储空间。
在一开始时弄清对象和类的关系是十分重要的。
2、声明类类型
类是用户自己指定的类型。如果程序中要用到类类型，必须自己根据需要进行声明，或者使用别人已设计好的类。C++标准本身并不提供现成的类的名称、结构和内容。
在C++中声明一个类类型和声明一个结构体类型是相似的。下面是声明一个结构体类型的方法：
struct Student //声明了一个名为Student的结构体类型
{
int num;
char name[20];
char sex;
};
Student stud1，stud2;
　　
//定义了两个结构体变量stud1和stud2，它只包括数据，没有包括操作。
现在声明一个类：
class Student //以class开头
{
int num;
char name[20];
char sex;//以上3行是数据成员
void display( ) //这是成员函数
{
cout<<″num:″<<num<<endl;
cout<<″name:″<<name<<endl;
cout<<″sex:″<<sex<<endl;
}//以上4行是函数中的操作语句
};
Student stud1,stud2;//定义了两个对象stud1和stud2
可以看到声明类的方法是由声明结构体类型的方法发展而来的。可以看到，类(class )就是对象的类型。实际上，类是一种广义的数据类型。类这种数据类型中的数据既包含数据，也包含操作数据的函数。
不能把类中的全部成员与外界隔离，一般是把数据隐蔽起来，而把成员函数作为对外界的接口。可以将上面类的声明改为
class Student //以class开头
{
private://声明私有成员int num;
char name[20];
char sex;
public://声明公共成员void display( ) 
{
cout<<″num:″<<num<<endl;
cout<<″name:″<<name<<endl;
cout<<″sex:″<<sex<<endl;
}
};
Student stud1,stud2;//定义了两个对象stud1和stud2
如果在类的定义中既不指定private，也不指定public，则系统就默认为是私有的。归纳以上对类类型的声明，可得到其一般形式如下：
class 类名
{
private : 私有的数据和成员函数;
public : 公用的数据和成员函数;
};
private和public称为成员访问限定符(member access specifier)。除了private和public之外，还有一种成员访问限定符protected(受保护的)，用protected声明的成员称为受保护的成员，它不能被类外访问(这点与私有成员类似)，但可以被派生类的成员函数访问。
在声明类类型时，声明为private的成员和声明为public的成员的次序任意，既可以先出现private部分，也可以先出现public部分。如果在类体中既不写关键字private，又不写public，就默认为private。
在一个类体中，关键字private和public可以分别出现多次。每个部分的有效范围到出现另一个访问限定符或类体结束时(最后一个右花括号)为止。但是为了使程序清晰，应该养成这样的习惯： 使每一种成员访问限定符在类定义体中只出现一次。
在以前的C++程序中，常先出现private部分，后出现public部分，如上面所示。现在的C++ 程序多数先写public部分，把private部分放在类体的后部。这样可以使用户将注意力集中在能被外界调用的成员上，使阅读者的思路更清晰一些。
在C++程序中，经常可以看到类。为了用户方便，常用的C++编译系统往往向用户提供类库(但不属于C++语言的组成部分)，内装常用的基本的类，供用户使用。不少用户也把自己或本单位经常用到的类放在一个专门的类库中，需要用时直接调用，这样就减少了程序设计的工作量。
3、定义对象的方法
8.2.2节的程序段中，最后一行用已声明的Student类来定义对象，这种方法是很容易理解的。经过定义后，stud1和stud2就成为具有Student类特征的对象。stud1和stud2这两个对象都分别包括Student类中定义的数据和函数。
定义对象也可以有以下几种方法： 
1.先声明类类型，然后再定义对象前面用的就是这种方法，如Student stud1，stud2;//Student是已经声明的类类型在C++中，声明了类类型后，定义对象有两种形式。
（1）class 类名 对象名
如
class Student stud1,stud2;
把class和Student合起来作为一个类名，用来定义对象。
（2）类名 对象名
如
Student stud1，stud2;
直接用类名定义对象。
这两种方法是等效的。第1种方法是从C语言继承下来的，第2种方法是C++的特色，显然第2种方法更为简捷方便。
2.在声明类类型的同时定义对象
class Student{ //声明类类型
public : //先声明公用部分
void display( ){
cout<<″num:″<<num<<endl;
cout<<″name:″<<name<<endl;
cout<<″sex:″<<sex<<endl;
}
private : //后声明私有部分
int num;
char name[20];
char sex;
}stud1，stud2; //定义了两个Student类的对象
在定义Student类的同时，定义了两个Student 类的对象。
3.不出现类名，直接定义对象
class //无类名
{
private : //声明以下部分为私有的
┆
public : //声明以下部分为公用的
┆
}stud1，stud2;//定义了两个无类名的类对象
直接定义对象，在C++中是合法的、允许的，但却很少用，也不提倡用。在实际的程序开发中，一般都采用上面3种方法中的第1种方法。在小型程序中或所声明的类只用于本程序时，也可以用第2种方法。在定义一个对象时，编译系统会为这个对象分配存储空间，以存放对象中的成员。
4、类和结构体类型的异同
C++增加了class类型后，仍保留了结构体类型(struct )，而且把它的功能也扩展了。C++允许用struct来定义一个类型。如可以将前面用关键字class声明的类类型改为用关键字struct：
struct Student{ //用关键字struct来声明一个类类型
private: //声明以下部分为私有的
int num; //以下3行为数据成员
char name[20];
char sex;
public: //声明以下部分为公用的
void display( ){ //成员函数
cout<<″num:″<<num<<endl;
cout<<″name:″<<name<<endl;
cout<<″sex:″<<sex<<endl;
}
};
Student stud1，stud2;//定义了两个Student类的对象
为了使结构体类型也具有封装的特征，C++不是简单地继承C的结构体，而是使它也具有类的特点，以便于用于面向对象程序设计。用struct声明的结构体类型实际上也就是类。用struct声明的类，如果对其成员不作private或public的声明，系统将其默认为public。
如果想分别指定私有成员和公用成员，则应用private或public作显式声明。
而用class定义的类，如果不作private或public声明，系统将其成员默认为private，在需要时也可以自己用显式声明改变。如果希望成员是公用的，使用struct比较方便，如果希望部分成员是私有的，宜用class。建议尽量使用class来建立类，写出完全体现C++风格的程序。[15]
编程开发
开发方式
在unix世界有大量的程序员是传统的非IDE的方式进行软件开发。一般是如下组合：
1.编译器：gcc，clang等
2.编辑器：一般是vim/emacs
3.make:gnu make 或者bsd 的pmake等，功能与用法基本一样
4.版本管理：cvs,svn,git等
5.代码阅读：cscope,ctags,lxr等
集成开发环境（IDE）
1.Visual Studio（Visual C++）  GNU GCC[16]
2.Borland C++ Builder
3.Eclipse(Myln + CDT + MinGW32 + GCC)
4.Dev-C++(MinGW32 + GCC)
5.Code::Blocks（可配合多款编译内核使用）
6.CodeLite
  Microsoft Visual Studio 2010
7.C-Free
8.Qt Creator等基于Qt开发框架的IDE
如上所示，目前流行的 GNU GCC 和 Microsoft Visual Studio 以及 Borland C++ Builder 系列各执一套基本的编译链，其它的IDE都是衍生产品。
  Borland C++Builder6.0
多泛型设计(multi-paradigm)
根据Effective C++第三版第一条款的描述，现在C++由以下四个“子语言”组成：
1、C子语言。C++支持C语言的几乎全部功能，主要是c89的部分，在语法上与C语言仅有极微妙的差别(如括号表达式的左右值性，具体请参考C++标准文献)。这部分功能对应于传统的面向过程的编程泛型，并提供了面向函数编程泛型的基础。
2、面向对象的C++语言。C++语言原本不具备面向对象的设计功能，然而随着面向对象编程的概念的普及，C++语言也开发出了支持面向对象功能的版本。这部分功能对应于面向对象的编程泛型。
3、泛型编程语言。C++强大（但容易失控的）模板功能使它能在编译期完成许多工作，从而大大提高运行期效率,并且大大提高了C++的表达能力。STL（C++标准模板库，Standard Template Library）是一个基于模板技术的库。随着STL的不断发展，它已经逐渐成为C++程序设计中不可或缺的部分，其效率可能比一般的native代码低些，但是其安全性与规范性使它大受欢迎。模板使C++能够支持泛型编程（generic programming）和生成式编程（generative programming）的泛型。　　
4、在C++0X中引入的Lambda，使得程序员可以定义匿名函数，完善了C++对于面向函数的编程泛型的支持。
经典著作
《The C++ Standard Library: A Tutorial and Reference》（《C++标准程序库：自修教程与参考手册》）；
《Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference》（《标准C++输入输出流与本地化》）；
《Effective STL》；
《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》（《泛型编程与STL》）　
《C++ Network Programming》（《C++网络编程》）；
《Thinking in C++》（《C++编程思想》）；
《Ruminations on C++: A Decade of Programming Insight and Experience》（《C++沉思录》） ；
《Inside The C++ Object Model》（《深度探索C++对象模型》）； 
《Design Patterns:Elements of Reusable Object-Oriented software》（《设计模式：可复用面向对象软件的基础》）；
《Large-Scale C++ Software Design》（《大规模C++程序设计》）；
《STL 源码剖析》；
《The C++ Standard : Incorporating Technical Corrigendum No. 1》；　
《C++面向对象程序设计》；　
《C++ Primer中文版(第4版）》；　
《C++ Primer plus（第五版） 》。[17-18]
对于入门新手，可以先从简单的开始学习，最好是先从纸质书籍再转到电子书籍类看。
纸质书籍类： 
《C++程序设计语言》
《C++语言的设计和演化》 
《C++标准程序库:自修教程与参考手册》 
《STL源码剖析》 
《C++设计新思维?C++标准库扩展权威指南》 
《C++入门经典(第3版)(Wrox红皮书)》 [19]
电子书籍类： 
《概观C++程序设计语言》 
《高质量C++编程指南——上海贝尔标准编程文档 》
《Preprocessor C++》 
《C++语言基础》 
《Essential C++》 
《(More)Effective C++ 》
《(More)Exceptional C++ 》
《Addison_C++ Network Programming （卷1、2）》 
《C++ Templates》 
《Core C++ A Software Engineering Approach 》[19]
常见错误
英文
参考译文
Ambiguous operators need parentheses 
不明确的运算需要用括号括起
Ambiguous symbol ''xxx'' 
不明确的符号
Argument list syntax error 
参数表语法错误
Array bounds missing 
丢失数组界限符
Array size toolarge 
数组尺寸太大
Bad character in paramenters 
参数中有不适当的字符
Bad file name format in include directive 
包含命令中文件名格式不正确
Bad ifdef directive synatax 
编译预处理ifdef有语法错
Bad undef directive syntax 
编译预处理undef有语法错
Bit field too large 
位字段太长
Call of non-function 
调用未定义的函数
Call to function with no prototype 
调用函数时没有函数的说明
Cannot modify a const object 
不允许修改常量对象
Case outside of switch 
漏掉了case 语句
Case syntax error
Case 语法错误
Code has no effect 
代码不可述不可能执行到
Compound statement missing{ 
分程序漏掉"{"
Conflicting type modifiers
不明确的类型说明符
Constant expression required
要求常量表达式
Constant out of range in comparison
在比较中常量超出范围
Conversion may lose significant digits
转换时会丢失意义的数字
Conversion of near pointer not allowed
不允许转换近指针
Could not find file ''xxx'' 
找不到XXX文件
Declaration missing ; 
说明缺少"；" 
Declaration syntax error 
说明中出现语法错误
Default outside of switch
Default 出现在switch语句之外
Define directive needs an identifier
定义编译预处理需要标识符
Division by zero
用零作除数
Do statement must have while
Do-while语句中缺少while部分
Enum syntax error
枚举类型语法错误
Enumeration constant syntax error
枚举常数语法错误
Error directive :xxx 
错误的编译预处理命令
Error writing output file
写输出文件错误
Expression syntax error 
表达式语法错误
Extra parameter in call 
调用时出现多余错误
File name too long 
文件名太长
Function call missing 
函数调用缺少右括号
Fuction definition out of place
函数定义位置错误
Fuction should return a value 
函数必需返回一个值
Goto statement missing label 
Goto语句没有标号
Hexadecimal or octal constant too large
16进制或8进制常数太大
Illegal character ''x'' 
非法字符x
Illegal initialization 
非法的初始化
Illegal octal digit 
非法的8进制数字 
Illegal pointer subtraction
非法的指针相减
Illegal structure operation 
非法的结构体操作
Illegal use of floating point 
非法的浮点运算
Illegal use of pointer 
指针使用非法
Improper use of a typedefsymbol 
类型定义符号使用不恰当
In-line assembly not allowed 
不允许使用行间汇编
Incompatible storage class
存储类别不相容
Incompatible type conversion
不相容的类型转换
Incorrect number format
错误的数据格式
Incorrect use of default
Default使用不当
Invalid indirection 
无效的间接运算
Invalid pointer addition
指针相加无效
Irreducible expression tree
无法执行的表达式运算
Lvalue required 
需要逻辑值0或非0值
Macro argument syntax error
宏参数语法错误
Macro expansion too long 
宏的扩展以后太长
Mismatched number of parameters in definition 
定义中参数个数不匹配
Misplaced break 
此处不应出现break语句
Misplaced continue 
此处不应出现continue语句
Misplaced decimal point
此处不应出现小数点
Misplaced elif directive
不应编译预处理elif
Misplaced else 
此处不应出现else 
Misplaced else directive 
此处不应出现编译预处理else
Misplaced endif directive
此处不应出现编译预处理endif
Must be addressable
必须是可以编址的
Must take address of memory location 
必须存储定位的地址
No declaration for function ''xxx'' 
没有函数xxx的说明
No stack 
缺少堆栈
No type information/没有类型信息
缺少堆栈
Non-portable pointer assignment 
不可移动的指针（地址常数）赋值
Non-portable pointer comparison 
不可移动的指针（地址常数）比较
Non-portable pointer conversion
不可移动的指针（地址常数）转换
Not a valid expression format type 
不合法的表达式格式
Not an allowed type 
不允许使用的类型
Numeric constant too large 
数值常太大
Out of memory
内存不够用
Parameter ''xxx'' is never used
能数xxx没有用到
Pointer required on left side of -> 
符号->的左边必须是指针
Possible use of ''xxx'' before definition
在定义之前就使用了xxx（警告）
Possibly incorrect assignment 
赋值可能不正确
Redeclaration of ''xxx'' 
重复定义了xxx
Redefinition of ''xxx'' is not identical
xxx的两次定义不一致
Register allocation failure 
寄存器定址失败
Repeat count needs an lvalue 
重复计数需要逻辑值
Size of structure or array not known
结构体或数给大小不确定
Statement missing ; 
语句后缺少"；"
Structure or union syntax error 
结构体或联合体语法错误
Structure size too large 
结构体尺寸太大
Sub scripting missing ] 
下标缺少右方括号
Superfluous & with function or array
函数或数组中有多余的"&"
Suspicious pointer conversion 
可疑的指针转换
Symbol limit exceeded 
符号超限
Too few parameters in call 
函数调用时的实参少于函数的参数不
Too many default cases 
Default太多(switch语句中一个)
Too many error or warning messages 
错误或警告信息太多[18]
英文
参考译文
Too many type in declaration 
说明中类型太多 
Too much auto memory in function
函数用到的局部存储太多
Too much global data defined in file 
文件中全局数据太多
Two consecutive dots 
两个连续的句点
Type mismatch in parameter xxx 
参数xxx类型不匹配
Type mismatch in redeclaration of ''xxx'' 
xxx重定义的类型不匹配
Unable to create output file ''xxx'' 
无法建立输出文件xxx
Unable to open include file ''xxx'' 
无法打开被包含的文件xxx
Unable to open input file ''xxx'' 
无法打开输入文件xxx
Undefined label ''xxx'' 
没有定义的标号xxx
Undefined structure ''xxx'' 
没有定义的结构xxx
Undefined symbol ''xxx'' 
没有定义的符号xxx
Unexpected end of file in comment started on line xxx 
从xxx行开始的注解尚未结束文件不能结束
Unexpected end of file in conditional started on line xxx 
从xxx 开始的条件语句 尚未结束文件不能结束
Unknown assemble instruction
未知的汇编结构 
Unknown option 
未知的操作
Unknown preprocessor directive: ''xxx''
不认识的预处理命令xxx
Unreachable code
无路可达的代码
Unterminated string or character constant 
字符串缺少引号
User break
用户强行中断了程序
Void functions may not return a value 
Void类型的函数不应有返回值
Wrong number of arguments 
调用函数的参数数目错
''xxx'' not an argument 
xxx不是参数
''xxx'' not part of structure
xxx不是结构体的一部分
xxx statement missing ( 
xxx语句缺少左括号
xxx statement missing ) 
xxx语句缺少右括号
xxx statement missing ; 
xxx缺少分号 
xxx'' declared but never used 
说明了xxx但没有使用
xxx'' is assigned a value which is never used 
给xxx赋了值但未用过
Zero length structure
结构体的长度为零[10]

编写实现
一个程序从编写到最后得到运行结果要经历以下一些步骤｡
1.用C++语言编写程序
用高级语言编写的程序称为“源程序”(source program)｡C++的源程序是以.cpp作为后缀的(cpp是c plus plus 的缩写)｡
2.对源程序进行编译
为了使计算机能执行高级语言源程序,必须先用一种称为“编译器(complier)”的软件(也称编译程序或编译系统),把源程序翻译成二进制形式的“目标程序(object program)”｡
编译是以源程序文件为单位分别编译的｡目标程序一般以.obj或.o作为后缀(object 的缩写)｡编译的作用是对源程序进行词法检查和语法检查｡编译时对文件中的全部内容进行检查,编译结束后会显示出所有的编译出错信息｡一般编译系统给出的出错信息分为两种,一种是错误(error);一种是警告(warning) ｡
3.将目标文件连接
在改正所有的错误并全部通过编译后,得到一个或多个目标文件｡此时要用系统提供的“连接程序(linker)”将一个程序的所有目标程序和系统的库文件以及系统提供的其他信息连接起来,最终形成一个可执行的二进制文件,它的后缀是.exe,是可以直接执行的｡
4.运行程序
运行最终形成的可执行的二进制文件(.exe文件),得到运行结果｡[20]
如果运行结果不正确,应检查程序或算法是否有问题｡