在C基础上,一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C++。 C++进一步扩充和完善了C语言,成为一种面向 对象的程序设计语言。C++目前流行的编译器最新版本是Borland C++ 4.5,Symantec C++ 6.1,和Microsoft Visual C++ 2012。C++提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性,掌握起来有一定难度。
C++由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。开始,C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(Operator Overloading)、多重继承(Multiple Inheritance)、模板(Template)、异常(Exception)、RTTI、命名空间(Name Space)逐渐被加入标准。
C++1998年国际标准组织(international standard organization, ISO)颁布了C++程序设计语言的国际标准ISO/IEC 1988-1998。C++是具有国际标准的编程语言,通常称作ANSI/ISOC++。
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。
C++名字的由来
C++这个名字是Rick Mascitti于1983年中所建议的,并于1983年12月首次使用。更早以前,尚在研究阶段的发展中语言曾被称为“new C”,之后是“C with Classes”。在计算机科学中,C++仍被称为C语言的上层结构。它最后得名于C语言中的“++”操作符(其对变量的值进行递增)。而且在共同的命名约定中,使用“+”以表示增强的程序。Stroustrup说:“这个名字象征著源自于C语言变化的自然演进”。C+是一个和C/C++无关的早期编程语言。
Rick Mascitti在1992年被非正式地问起名字的由来,他表示这是在半开玩笑中说出的。他从没想过C++会成为这门语言的正式名字。
有一个关于C++名字的笑话是,当你使用后缀++时,附加只发生在运算之后(因此,它应该是++C,而不是C++,这个笑话是说时下某些程序员还在以使用C的方式使用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不兼容之处
C++一般被认为是C的超集合(Superset),但这并不严谨。大部分的C代码可以很轻易的在C++中正确编译,但仍有少数差异,导致某些有效的C代码在C++中失效,或者在C++中有不同的行为。
最常见的差异之一是,C允许从void*隐式转换到其它的指针类型,但C++不允许。下列是有效的C代码:
/* 从 void * 隐式转换为 int * */
int * i = malloc(sizeof(int) * 5);
但要使其在C和C++两者皆能运作,就需要使用显式转换:
int * i = (int *)malloc(sizeof(int) * 5);
C++另一个常见的可移植问题是,C++定义了很多的新关键字,如new和class,它们在C程序中,是可以作为识别字(例:变量名)的。
C99去除了一些不兼容之处,也支持了一些C++的特性,如//注解,以及在代码中混合声明。不过C99也纳入几个和C++冲突的新特性(如:可变长度数组、原生复数类型和复合逐字常数)。
若要混用C和C++的代码,则所有在C++中调用的C代码,必须放在extern "C" { /* C代码 */ }之内。
发展历史
C++语言发展大概可以分为三个阶段:
第一阶段
从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;
第二阶段
从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;
第三阶段
从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。
优点
· C++设计成静态类型、和C同样高效且可移植的多用途程序设计语言。
· C++设计成直接的和广泛的支持多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。
· C++设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。
· C++设计成尽可能与C兼容,借此提供一个从C到C++的平滑过渡。
· C++避免平台限定或没有普遍用途的特性。
· C++不使用会带来额外开销的特性。
· C++设计成无需复杂的程序设计环境。
出于保证语言的简洁和运行高效等方面的考虑,C++的很多特性都是以库(如STL)或其他的形式提供的,而没有直接添加到语言本身里。关于此类话题,Bjarne Stroustrup的《C++语言的设计和演化》(1994)里做了详尽的陈述。
C++在一定程度上可以和C语言很好的结合,甚至大多数C语言程序是在C++的集成开发环境中完成的。C++相对众多的面向对象的语言,具有相当高的性能。
C++引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。很多优秀的程序框架包括MFC、QT、wxWidgets就是使用的C++。
C++程序代码性能
人们一般认为,使用Java或C#的开发成本比C++低。但是,如果充分分析C++和这些语言的差别,会发现这句话的成立是有条件的。这个条件就是:软件规模和复杂度都比较小。如果不超过3万行有效代码(不包括生成器产生的代码),这句话基本上还能成立。否则,随着代码量和复杂度的增加,C++的优势将会越来越明显。造成这种差别的就是C++的软件工程性。
缺点
C++由于语言本身过度复杂,这甚至使人类难于理解其语义。更为糟糕的是C++的编译系统受到C++的复杂性的影响,非常难于编写,即使能够使用的编译器也存在了大量的问题,这些问题大多难于被发现。
由于本身的复杂性,复杂的C++程序的正确性相当难于保证。也有人提出不支持多线程的原语等缺陷。不过有如此多的知名人士提出了如此多的缺陷,正说明C++被广泛使用和成功。
c++语言由于过度的复杂性,以及与Unix的文化相抵触,在Unix/Linux领域受到很多著名人士(比如Linux之父Linus Torvalds与著名黑客Eric S. Raymond)的强烈批评与抵制。
new和delete
运算符new和delete提供了存储的动态内存分配和释放功能,它的作用相当于C语言的函数malloc()和free(),但是性能更为优越。使用new较之使用malloc()有以下的几个优点:
(1)new自动计算要分配类型的大小,不使用sizeof运算符,比较省事,可以避免错误。
(2)自动地返回正确的指针类型,不用进行强制指针类型转换。
(3)可以用new对分配的对象进行初始化
inline
对于频繁使用的函数,C语言建议使用宏调用代替函数调用以加快代码执行,减少调用开销。但是宏调用有许多的弊端,可能引起不期望的副作用。例如宏:#define abs(a)(a)<0?(-a):(a)),当使用abs(i++)时,这个宏就会出错。
所以在C++中应该使用inline内联函数替代宏调用,这样既可达到宏调用的目的,又避免了宏调用的弊端。
使用内联函数只须把inline关键字放在函数返回类型的前面。
函数重载
在C语言中,两个函数的名称不能相同,否则会导致编译错误。而在C++中,函数名相同而参数数据类型不同或参数个数不同或二者皆不同的两个函数被解释为重载。
使用函数重载可以帮助程序员处理更多的复杂问题,避免了使用诸如intabs()、fabs()、dabs()等繁杂的函数名称;同时在大型程序中,使函数名易于管理和使用,而不必绞尽脑汁地去处理函数名。同时必须注意,参数数据类型相同,但是函数返回类型不同的两个函数不能重载。
参数传递
在C语言中,如果一个函数需要修改用作参数的变量值的时候 ,参数应该声明为指针类型;当参数的大小超过一个机器字长时,通过传值方式来传递参数的效率较低,也需要用指针。由于C语言的指针可以进行p++,--p,p+=1等算术运算,所以编译器无法在编译的时候确定指针引用的变量。对于复杂的程序,使用指针容易出错,程序也难以读懂。在C++中,对于上述情况 可以使用引用来代替指针,使程序更加清晰易懂。引用就是对变量取的一个别名,对引用进行操作,这就相当于对原有变量进行操作。
缺省参数
在C++中函数可以使用缺省参数。
通常的情况下,一个函数应该具有尽可能大的灵活性。使用缺省参数为程序员处理更大的复杂性和灵活性问题提供了有效的方法,所以在C++的代码中都大量地使用了缺省参数。
C++相关书籍需要说明的是,所有的缺省参数必须出现在不缺省参数的右边。亦即,一旦开始定义缺省参数,就不可再说明非缺省的参数。否则当你省略其中一个参数的时候,编译器无法知道你是自定义了这个参数还是利用了缺省参数而定义了非缺省的参数。
使用STL
STL(Standard Template Library,标准模板库), STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),并包括一些工具类如auto_ptr。几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
作用符被重载,使得我们可以像访问数组一样访问vector中的元素。
使用模板
模板的概念
模板是C++的一个特性,是函数和类可以作用于不同的类型上而不需要针对每一个具体类型重复相同的代码。与模板相反,我们已经学过的重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。如果使用模板就可以只写一个通用的MAX模板,而不需要针对每个类型重复相同的逻辑。
指针与引用的区别
指针与引用看上去完全不同(指针用操作符“*”和“->”,引用使用操作符“&”),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?
首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
类和对象的作用
类是C++中十分重要的概念,它是实现面向对象程序设计的基础。类是所有面向对象的语言的共同特征,所有面向对象的语言都提供了这种类型。一个有一定规模的C++程序是由许多类所构成的。
C++支持面向过程的程序设计,也支持基于对象的程序设计,又支持面向对象的程序设计。以后我们将介绍基于对象的程序设计。包括类和对象的概念、类的机制和声明、类对象的定义与使用等。这是面向对象的程序设计的基础。基于对象就是基于类。与面向过程的程序不同,基于对象的程序是以类和对象为基础的,程序的操作是围绕对象进行的。
在此基础上利用了继承机制和多态性,就成为面向对象的程序设计(有时不细分基于对象程序设计和面向对象程序设计,而把二者合称为面向对象的程序设计)。
基于对象程序设计所面对的是一个个对象。所有的数据分别属于不同的对象。在面向过程的结构化程序设计中,人们常使用这样的公式来表述程序:
C++相关书籍程序=算法+数据结构
算法和数据结构两者是互相独立、分开设计的,面向过程的程序设计是以算法为主体的。在实践中人们逐渐认识到算法和数据结构是互相紧密联系不可分的,应当以一个算法对应一组数据结构,而不宜提倡一个算法对应多组数据结构,以及一组数据结构对应多个算法。基于对象和面向对象程序设计就是把一个算法和一组数据结构封装在一个对象中。因此,就形成了新的观念:
对象=算法+数据结构
程序 = (对象+对象+对象+…) + 消息
或:
程序 = 对象s + 消息
“对象s”表示多个对象。消息的作用就是对对象的控制。程序设计的关键是设计好每一个对象,及确定向这些对象发出的命令,使各对象完成相应操作。
1、类和对象的关系
每一个实体都是对象。有一些对象是具有相同的结构和特性的。每个对象都属于一个特定的类型。在C++中对象的类型称为类(class )。类代表了某一批对象的共性和特征。前面已说明:类是对象的抽象,而对象是类的具体实例(instance)。
正如同结构体类型和结构体变量的关系一样,人们先声明一个结构体类型,然后用它去定义结构体变量。同一个结构体类型可以定义出多个不同的结构体变量。
在C++中也是先声明一个类类型,然后用它去定义若干个同类型的对象。对象就是类类型的一个变量。可以说类是对象的模板,是用来定义对象的一种抽象类型。类是抽象的,不占用内存,而对象是具体的,占用存储空间。
在一开始时弄清对象和类的关系是十分重要的。
2、声明类类型
结构体类型的方法类是用户自己指定的类型。如果程序中要用到类类型,必须自己根据需要进行声明,或者使用别人已设计好的类。C++标准本身并不提供现成的类的名称、结构和内容。
在C++中声明一个类类型和声明一个结构体类型是相似的。
可以看到声明类的方法是由声明结构体类型的方法发展而来的。可以看到,类(class )就是对象的类型。实际上,类是一种广义的数据类型。类这种数据类型中的数据既包含数据,也包含操作数据的函数。
不能把类中的全部成员与外界隔离,一般是把数据隐蔽起来,而把成员函数作为对外界的接口。可以将上面类的声明改为
class Student //以class开头 {
private://声明私有成员
int num;
char name;
char sex;
public://声明公共成员
void display( ) {
cout<<″num:″<
如果在类的定义中既不指定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++语言的组成部分),内装常用的基本的类,供用户使用。不少用户也把自己或本单位经常用到的类放在一个专门的类库中,需要用时直接调用,这样就减少了程序设计的工作量。
上述程序段中,最后一行用已声明的Student类来定义对象,这种方法是很容易理解的。经过定义后,stud1和stud2就成为具有Student类特征的对象。stud1和stud2这两个对象都分别包括Student类中定义的数据和函数。
C++相关书籍定义对象也可以有以下几种方法:
1.先声明类类型,然后再定义对象前面用的就是这种方法,如Student stud1,stud2;//Student是已经声明的类类型在C++中,声明了类类型后,定义对象有两种形式。
(1)class 类名 对象名
如
class Student stud1,stud2;
把class和Student合起来作为一个类名,用来定义对象。
(2)类名 对象名
如
Student stud1,stud2;
直接用类名定义对象。
这两种方法是等效的。第1种方法是从C语言继承下来的,第2种方法是C++的特色,显然第2种方法更为简捷方便。
class Student { //声明类类型
public : //先声明公用部分
void display( ) {
cout<<″num:″<
在定义Student类的同时,定义了两个Student 类的对象。
3.不出现类名,直接定义对象
class //无类名
{
private : //声明以下部分为私有的
public : //声明以下部分为公用的
}
stud1,stud2;//定义了两个无类名的类对象
直接定义对象,在C++中是合法的、允许的,但却很少用,也不提倡用。在实际的程序开发中,一般都采用上面3种方法中的第1种方法。在小型程序中或所声明的类只用于本程序时,也可以用第2种方法。在定义一个对象时,编译系统会为这个对象分配存储空间,以存放对象中的成员。
C++关键字(keyword)是整个语言范围内预先保留的标识符。每个C++关键字都有特殊的含义。经过预处理后,关键字从预处理记号(preprocessing-token)中区出来,剩下的标识符作为记号(token),用于声明对象、函数、类型、命名空间等。不能声明与关键字同名的标识符。
各个版本的ISO C++都规定以下划线接大写字母起始的标识符保留给实现。编译器可以用这些保留标识符作为扩展关键字,这不保证可移植性。以下讨论ISO C++所保留的关键字。
ISO关键字
共63个,此处严格按标准原文排版:
asm |
do |
if |
return |
typedef |
auto |
double |
inline |
short |
typeid |
bool |
dynamic_cast |
int |
signed |
typename |
break |
else |
long |
sizeof |
union |
case |
enum |
mutable |
static |
unsigned |
catch |
explicit |
namespace |
static_cast |
using |
char |
export |
new |
struct |
virtual |
class |
extern |
operator |
switch |
void |
const |
false |
private |
template |
volatile |
const_cast |
float |
protected |
this |
wchar_t |
continue |
for |
public |
throw |
while |
default |
friend |
register |
true |
|
delete |
goto |
reinterpret_cast |
try |
asm |
do |
if |
return |
typedef |
auto |
double |
inline |
short |
typeid |
bool |
dynamic_cast |
int |
signed |
typename |
break |
else |
long |
sizeof |
union |
case |
enum |
mutable |
static |
unsigned |
catch |
explicit |
namespace |
static_cast |
using |
char |
export |
new |
struct |
virtual |
class |
extern |
operator |
switch |
void |
const |
false |
private |
template |
volatile |
const_cast |
float |
protected |
this |
wchar_t |
continue |
for |
public |
throw |
while |
default |
friend |
register |
true |
|
delete |
goto |
reinterpret_cast |
try |
开发方式
在unix世界有大量的程序员是传统的非IDE的方式进行软件开发。一般是如下组合:
1.编译器:gcc,clang等
2.编辑器:一般是vim/emacs
3.make:gnu make 或者bsd 的pmake等,功能与用法基本一样
4.版本管理:cvs,svn,git等
5.代码阅读:cscope,ctags,lxr等
C++相关书籍集成开发环境(IDE)
1.Visual Studio(Visual C++)
2.Borland C++ Builder
3.Eclipse(Myln + CDT + MinGW32 + GCC)
4.Dev-C++(MinGW32 + GCC)
5.Code::Blocks(可配合多款编译内核使用)
6.CodeLite
7.C-Free
8.Qt Creator等基于Qt开发框架的IDE
如上所示,流行的 GNU GCC 和 Microsoft Visual Studio 以及 Borland C++ Builder 系列各执一套基本的编译链,其它的IDE都是衍生产品。
根据Effective C++第三版第一条款的描述,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++相关书籍《C++ Primer中文版(第4版)》;
《C++ Primer中文版(第5版)》English版本 ;
《C++ Primer plus(第五版) 》。
对于入门新手,可以先从简单的开始学习,最好是先从纸质书籍再转到电子书籍类看。
纸质书籍类:
《C++程序设计语言》
《C++语言的设计和演化》
《C++标准程序库:自修教程与参考手册》
《STL源码剖析》
《C++设计新思维?C++标准库扩展权威指南》
《C++入门经典(第3版)(Wrox红皮书)》
《C++语言程序设计》(第四版) 清华大学出版社
电子书籍类:
《概观C++程序设计语言》
《高质量C++编程指南——上海贝尔标准编程文档 》
《Preprocessor C++》
《C++语言基础》
《Essential C++》
《(More)Effective C++ 》
《(More)Exceptional C++ 》
《C++ Templates》
《Core C++ A Software Engineering Approach》
英文 |
参考译文 |
---|---|
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 |
错误或警告信息太多 |
英文 |
参考译文 |
---|---|
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 |
结构体的长度为零 |
英文 |
参考译文 |
---|---|
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 |
错误或警告信息太多 |
英文 |
参考译文 |
---|---|
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 |
结构体的长度为零 |