历史简介  

  C语言之所以要起名为“C”,是取的“BCPL”的第二个字母(第一个字母用来命名之前被发明的B语言) 。当C语言发展到顶峰的时刻,出现了一个版本叫C with Class,那就是C++最早的版本,在C语言中增加class关键字和类,那个时候有很多版本的C都希望在C语言中增加类的概念;后来C标准委员会决定为这个版本的C起个新的名字,那个时候征集了很多种名字,最后采纳了其中一个人的意见,以C语言中的++运算符来体现它是C语言的进步,故而叫C++,成立了C++标准委员会。

  美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)博士在20世纪80年代初期发明并实现了C++(最初这种语言被称作“C with Classes”)。一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、命名空间(name space)逐渐被加入标准。1998年国际标准组织(ISO)颁布了C++程序设计语言的国际标准ISO/IEC 1988-1998。C++是具有国际标准的编程语言, 通常称作ANSI/ISO C++。1998年是C++标准委员会成立的第一年,以后每5年视实际需要更新一次标准,下一次标准更新原定是在2009年,目前我们一般称该标准 C++0x,但是由于对于新特性的争端激烈,除了在Technical Report 1(tr1)中的新增修改被基本确定外,完整的标准还遥遥无期。况且遗憾的是,由于C++语言过于复杂,以及经历了长年的演变,直到现在(2010年)都 没有有一个编译器完全符合这个标准。

  据Herb Sutter报告,C++0x最终国际投票已于周三(2011年8月10号)结束,所有国家都投出了赞成票,C++0x已经毫无疑义地成为正式国际标准。虽然接下来还需要数月时间出版发布,但标准本身已经完全正式成立了。

组成部分  根据Effective C++第三版第一条款的描述,现在C++由以下四个“子语言”组成:

  1、C子语言。C++支持C语言的几乎全部功能,主要是c89的部分,在语法上与C语言仅有极微妙的差别(如括号表达式的左右值性,具体请参考C++标准文献)。

  2、面向对象的C++语言。C++语言原本不具备面向对象的设计功能,然而随着面向对象编程的概念的提出以及如Java等语言的发展成熟,C++语言也开发出了支持面向对象功能的版本.

  3、泛型编程语言。C++强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。

  4、STL(C++标准模板库,Standard Template Library)。随着STL的不断发展,它已经逐渐成为C++程序设计中不可或缺的部分,其效率可能比一般的native代码低些,但是其安全性与规范性使它大受欢迎。

  此外,包含在TR1等中的C++0x将实现的新功能在开发和测试中。

语言发展

  C++语言发展大概可以分为三个阶段:

  第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;

  第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;

  第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。

入门书籍

  C++是一种语言,仅仅是它的语法、特性、标准类库就已经是一门非常高深的课程,所以在开始学习的时候,必须先要打好基础。在市面上有很多Visual C++的书,虽然其中可能会花1-2章来介绍C++的基本特性,但是那绝对不会让你入门。因此,初学者学习C++应该选择针对C++语言本身的书籍,而不能是针对Visual C++、MFC或者Windows API的。

  学习C++应该由易至难,循序渐进。以前经常有人说学习C++之前应该学习C语言。事实上那不是必须的,C++和C语言虽然有关系,但仍然是两种不同的语言。当然,在学习C++之前学习过其他编程语言是很有好处的。那会使学习C++的速度更快,毕竟很多计算机语言的概念都是相通的。而对于零基础的初学者来说,则是应该静下心来,不要急躁。要成为C++的高手,不是那么容易的,必须要花很大的努力。

  从入门教材的选择上,主要看学习者的自身情况。如果已经有过学习高级语言的经历,那么推荐使用谭浩强的 《C++程序设计》。注意是04年版的,06年版的那本书是阉割版,上来就面向对象。虽然说C和C++是相似的,但是前面已经说了,C和C++应该作为两 种语言来学习,所以06年的那本内容就稍微欠缺一点了。谭浩强04版的这本书内容比较规整的,条理也很清晰。如果有过其他高级语言的基础,那么估计半年就 能对C++的概况有个了解了。谭浩强老师的书已经成为了全国各大高等院校的教科书,是比较受到认可的。

  如果是从零基础开始学C++,那么推荐使用潘嘉杰的 《易学C++》。这本书是2008年出的新书,听说是个学生在读书的时候写的。这本书网上有下载免费的电子版。这本书主要就是针对初学者的,讲得也比较生 动有趣,比较提得起学习的兴趣。所以没有基础的初学者选这本书也是不错的,就是想要很快成为高手,可能看这本书还不够。

  至于看完入门的书之后,就应该看一些高层次的书了。比如<<The C++ Programming Language>>和<<C++ Primer>>,同时也可以向STL、MFC、API等各个方向发展。如果对别的语言感兴趣,还能去看看C#和Java,它们和C++从语 法和很多概念上都是类似的。

设计原则

  · C++设计成静态类型、和C同样高效且可移植的多用途程序设计语言。

  · C++设计成直接的和广泛的支援多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。

  · C++设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。

  · C++设计成尽可能与C兼容,籍此提供一个从C到C++的平滑过渡。

  · C++避免平台限定或没有普遍用途的特性。

  · C++不使用会带来额外开销的特性。

  · C++设计成无需复杂的程序设计环境。

  出于保证语言的简洁和运行高效等方面的考虑,C++的很多特性都是以库(如STL)或其他的形式提供的,而没有直接添加到语言本身里。关于此类话题,C++之父的《C++语言的设计和演化》 里做了详尽的陈述。

  

Hello World程序
在使用兼容C89标准(也称为ANSI C)的编译器时,下面这个程序显示“Hello, world!”然后结束运行:
(事实上这并不是符合98标准[ISO C++]的C++程序,而且在多数编译器上这个程序也不能运行,若要在比较旧的编译器上编译该程序,应将stdio.h改为iostream.h)
#include <stdio.h>
int main()
{
printf("Hello, world!\n");
return 0;
}
(以上是c语言代码,c++语言是c语言高一级的版本)
在使用兼容C++98标准(ISO/IEC 14882-1998)的编译器时,下面的程序也是可以的:
#include <iostream.h>
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
在使用兼容C++ STL的编译器时,应当是:
#include <iostream>
using namespace std;
int main()
{
cout<<"Hello,world!"<<endl;
return 0;
}
根据ISO C++的规定,main函数的形式只能是
int main(void)
{
...
}
以及
int main(int argc,char * argv[])
{
...
}
尽管如此,但在Visual C++ 2003以前的Microsoft Visual Studio编译器上,
void main()
{
...
}
也被支持,但这并不正确,也不标准。这样的写法会使程序代码丧失跨平台的特性。每年都有专业人士规定C++的语法,这也是C++优于其他编程语言的原因之一,由它衍生的Java已成为通用编程语言中广受欢迎的一种。

代码性能

  一般认为,使用Java或C#的开发成本比C++低。但是,如果你能够充分分析C++和这些语言的差别,会发现这句话的成立是有条件的。这个条件就是:软件规模和复杂度都比较小。如果不超过3万行有 效代码(不包括生成器产生的代码),这句话基本上还能成立。否则,随着代码量和复杂度的增加,C++的优势将会越来越明显。造成这种差别的就是C++的软 件工程性。在Java和C#大谈软件工程的时候,C++实际上已经悄悄地将软件工程性提升到一个前所未有的高度。这一点被多数人忽视,并且被大公司竭力掩 盖。

  语言在软件工程上的好坏,依赖于语言的抽象能力。从面向过程到面向对象,语言的抽象能力有了一个质的飞跃。但在实践中,人们发现面向对象无法解 决所有软件工程中的问题。于是,精英们逐步引入、并拓展泛型编程,解决更高层次的软件工程问题。(实际上,面向对象和泛型编程的起源都可以追溯到1967 年,但由于泛型编程更抽象,所以应用远远落后于面向对象)。

应用实例

  哪些程序是用C++写的:

  主流的3种操作系统Windows内核都是用C语言和汇编写的,上层高级特性是用C++写的。

  《魔兽世界》等几乎所有的网络游戏,百度搜索引擎,我们所用的大多数软件都是用C++写的(硬件也有很多用到C++的)。

  以下是一些C++的应用:

  Amazon:Software for large-scale e-commerce

  Apple: OS X is written in a mix of language, but a few important parts are C++(当然最核心的部分都是汇编与c语言).

  AT&T:The largest US telecommunications provider.

  o provisioning systems

  o systems for rapid network recovery after failure

  Autodesk: A large number of major number of application in the CAD domain

  Ericsson:

  o server platform.

  o TDMA-CDMA HLR

  o GSM-TDMA-CDMA mobility gateway

  Google: web search engine, etc。

  HP: Here is a tiny fraction of HP's C++ apps:

  o C, C++, Fortran90 compilers, and linker for the new HP IA64 platform (these add to more than 1 million lines of C++ code).

  IBM:

  o OS/400.

  o K42: a high performance, open source, general-purpose operating system kernel for cache-coherent multiprocessors.

  Intel:

  o Vtune performace analysis software

  o compilers and optimizers

  o lots of chip design and manufacturing software

  JPL (Jet Propulsion Lab, NASA): Mars rover autonomous driving system (incl. scene analysis and route planning). C++ on Mars! Also lots of supporting software "on the ground" (i.e. Earth).

  Microsoft:

  o Windows XP

  o Windows NT (NT4 and 2000)

  o Windows 9x (95, 98, Me)

  o Microsoft Office (Word, Excel, Access, PowerPoint, Outlook)

  o Internet Explorer (including Outlook Express)

  o Visual Studio

  o SQL

  Mozilla: Firefox browser and Thunderbird mail client (open source)

  MySQL: MySQL Server (about 250,000 lines of C++) and MySQL Cluster. Arguably the world's most popular open source database

  Nokia:

  o Mobile Communications radio-station/internet bridges: FlexiGGSN (Gateway GPRS Support Node) and FlexiSGSN (Server GPRS Support Node).

  o MSC/HLR

  Sun: o The HotSpot Java Virtual Machine is written in C++

  Symbian OS: rationale: "[...] using C++ for all system code, from the kernel upwards." This is one of the most widespread OS's for cellular phones

  KDE from linux is written in C++.

  telephone systems: I think it would be almost easier to list the systems which aren't written in C++

  C++写出的软件,还包括

  VLC, 著名的开源视频播放器;

  LAMMPS,著名分子动力学模拟软件,其中包括一部分Fortran代码;

编程技巧

使用new和delete进行动态内存分配和释放

  

  运算符new和delete是C++新增的运算符,提供了存储的动态分配和释放功能。它的作用相当于C语言的函数malloc()和free(),但是性能更为优越。使用new较之使用malloc()有以下的几个优点:

  (1)new自动计算要分配类型的大小,不使用sizeof运算符,比较省事,可以避免错误。

  (2)自动地返回正确的指针类型,不用进行强制指针类型转换。

  (3)可以用new对分配的对象进行初始化。

  使用例子:

  (1)int* p;

  p=new int[10]; //分配一个含有10个整数的整型数组

  delete[] p; //释放这个指向数组的指针所占内存

  (2)int* p;

  p=new int (100);//动态分配一个整数并初始化

使用inline内联函数替代宏调用

  对于频繁使用的函数,C语言建议使用宏调用代替函数调用以加快代码执行,减少调用开销。但是宏调用有许多的弊端,可能引起不期望的副作用。例如宏:#define abs(a)(a)<0?(-a):(a)),当使用abs(i++)时,这个宏就会出错。

  所以在C++中应该使用inline内联函数替代宏调用,这样既可达到宏调用的目的,又避免了宏调用的弊端。

  使用内联函数只须把inline关键字放在函数返回类型的前面。例如:

  inline int Add(int a,int b);//声明Add()为内联函数

  这样编译器在遇到Add()函数时,就不再进行函数调用,而是直接嵌入函数代码以加快程序的执行。

使用函数重载

  在C语言中,两个函数的名称不能相同,否则会导致编译错误。而在C++中,函数名相同而参数数据类型不同的两个函数被解释为重载。例如:

  void PutHz(char* str);//在当前位置输出汉字

  void PutHz(int x,?int y,?char * str);//在x,y处输入数字

  使用函数重载可以帮助程序员处理更多的复杂问题,避免了使用诸如intabs()、fabs()、dabs()等繁杂的函数名称;同时在大型程序中,使函数名易于管理和使用,而不必绞尽脑汁地去处理函数名。同时必须注意,参数数据类型相同,但是函数返回类型不同的两个函数不能重载。

用引用(reference)代替指针进行参数传递

  在C语言中,如果一个函数需要修改用作参数的变量值的时候 ,参数应该声明为指针类型。例如:

  void Add(int *a)

  {

  (*a)++;

  }

  调用时则使用

  Add(&x); //其中x为int或可以转化为int的类型,如unsigned int, 但这时候编译器通常会给出warning

  对于复杂的程序,使用指针容易出错,程序也难以读懂。在C++中,对于上述情况 可以使用引用来代替指针,使程序更加清晰易懂。引用就是对变量取的一个别名,对引用进行操作,这就相当于对原有变量进行操作。例如使用引用的函数定义为:

  void Add(int& a)

  {

  a++; //a为一个整数的引用

  }

  调用时使用

  Add(x); //其中x为int

  这个函数与使用指针的上一个函数的功能是一样的,然而代码却更为简洁和清晰易懂。

使用缺省参数

  在C++中函数可以使用缺省参数,例如:

  void PutHzxy(char *str,int x=-1, int y=-1)

  {

  if(x==-1)

  x=wherex();

  if(y==-1)

  x=wherex();

  moveto(x,y);

  PutHx(str);

  }

  可以有三种方式调用函数PutHzxy(),例如:

  PutHzxy("C++语言");//使用缺省参数,在当前位置输出

  PutHzxy("C++语言",10,10);//没有使用缺省参数

  PutHzxy("C++语言",10);//对y使用缺省参数,指定x的位置

  通常的情况下,一个函数应该具有尽可能大的灵活性。使用缺省参数为程序员处理更大的复杂性和灵活性问题提供了有效的方法,所以在C++的代码中都大量地使用了缺省参数。

  需要说明的是,所有的缺省参数必须出现在不缺省参数的右边。亦即,一旦开始定义缺省参数,就不可再说明非缺省的参数。否则当你省略其中一个参数的时候,编译器无法知道你是自定义了这个参数还是利用了缺省参数而定义了非缺省的参数。

  例如: 

  void PutHzxy(char*str,int x=-1,int y=-1)//正确

  void PutHzxy(int x=-1,int y=-1,char*str)//错误

使用STL

  STL(Standard Template Library,标准模板库), STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),并包括一些工具类如auto_ptr。几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。

  #include<vector>// 包含相关的头文件/

  typedef std::vector<int> intvector;//使用typedef 使代码看起来更简洁

  int main()

  {

  intvector vi;

  for(int i=0;i<10,i++)

  vi.push_back(i);//使用push_back添加元素

  for(int i=0;i<vi.size();i++)

  std::cout<<vi[i]<<" ";//[]操作符被重载,使得我们可以像访问数组一样访问vector中的元素

  }

开发方式

  在unix世界有大量的程序员是传统的非IDE的方式进行软件开发。一般是如下组合:

  1.编译器:gcc,clang等

  2.编辑器:一般是vim/emacs

  3.make:gnu make 或者bsd 的pmake等,功能与用法基本一样

  4.版本管理:cvs,svn,git等

  5.代码阅读:cscope,ctags,lxr等

开发环境

  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 

  如上所示,目前流行的GNU GCC和微软的Visual Studio系列各执一套基本的编译链,其他的IDE都是衍生产品

  

经典著作

  ●《The C++ Standard Library: A Tutorial and Reference》

  中文版:《C++标准程序库:自修教程与参考手册》

  百科全书式的C++标准库著作,一本需要一再查阅的参考大全。本书详细介绍了每一标准库组件的规格和用法,内容涵盖包括流和本地化在内的整个标 准库而不仅仅是STL。正如本书副标题所示,它首先适合作为教程阅读,尔后又可用作参考手册。 浅显易懂的写作风格使得这本书非常易读。

  ●《Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference》

  中文版《标准C++输入输出流与本地化》

  ●《Effective STL》

  使用STL的程序员必读之作。在这本书中,Scott讲述了STL容器和算法的工作机制以及如何以最佳方式使用它们。和Scott的其他作品一样,这本书的写作风格清晰、精确,具有极佳的可读性。

  ●影印版《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》

  中文版《泛型编程与STL》

  这本书散发着浓厚的学院气息。Andrew Koenig和Barbara Moo在《Accelerated C++: Practical Programming by Example》一书末尾郑重推荐另外两本进阶好书(除了他们自己的《Ruminations on C++》外),其中一本是TCPL,另外一本就是本书。

  ●Douglas C. Schmidt, Stephen D. Huston,《C++ Network Programming》

  Volume 1: Mastering Complexity with ACE and Patterns;

  Volume 2: Systematic Reuse with ACE and Frameworks;

  中文版:,《C++网络编程》

  卷1:运用ACE和模式消除复杂性

  卷2:基于 ACE 和框架的系统化复用

  采用C++进行企业级网络编程,ACE(Adaptive Communications Environment)是一个值得考虑的选择,ACE是一个面向对象、跨平台、开放源码的网络编程框架,目标在于构建高性能网络应用和中间件。

  Douglas是ACE的创始人,Stephen则已为ACE提供了数年的技术支持和顾问服务,两位都是ACE社群(是的,ACE的影响和实际应用的程度已经形成了一个社群)的专家。

  除了使用C++面向对象设计技术和模板等高级语言特性外,ACE还运用了大量的模式。《C++网络编程》卷1和卷2并不仅仅教你关于ACE的方方面面,它还会教给你模式和通用框架设计等高级技术等。

  并非所有网络应用都要使用Web服务器(以及其他应用服务器)和重量级组件模型,换个思路,它们或许也可以从轻量级的ACE组件中获益。

  ●Bruce Eckel,《Thinking in C++》影印版二版、三版(又名卷二)

  中文《C++编程思想》二版

  卷一:标准C++导引

  卷二:实用编程技术

  《Thinking in C++》的第1版于1996年荣获“软件研发”杂志评选的图书震撼大奖。第2版对内容进行了大幅改写和调整,以反映C++标准化带来的影响以及当时面向对象领域最新研究和实践成果。

  “输入输入流”、“多重继承”、“异常处理”和“运行时类型识别”等高级主题连同C++标准化以后增加的一些内容则被放入第二卷中。

  事实上,在同类图书中,对于大多数读者而言,这本书的可读性要超过TCPL和《C++ Primer》。

  顺带一提,访问作者的站点,你可以先睹第二卷的风采。

  ●Andrew Koenig, Barbara E. Moo,《Ruminations on C++: A Decade of Programming Insight and Experience》

  中文版《C++沉思录》

  一本关于C++编程思想和程序设计技术而非语言细节的著作。

  Bjarne这样评价这本书:本书遍布“C++是什么?C++能够做什么?”的真知灼见。

  ●Stanley B. Lippman,影印版《Inside The C++ Object Model》

  中文版《深度探索C++对象模型》

  从编译器的角度观察C++。本书探讨了大量的C++面向对象程序设计的底层运作机制,包括构造函数、函数、临时对象、继承、虚拟、模板的实例化、异常处理、运行期类型识别等,另外还介绍了一些在实现C++对象模型过程中做出的权衡折衷。

  ●Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides,《Design Patterns:Elements of Reusable Object-Oriented software》

  中文版《设计模式:可复用面向对象软件的基础》

  本书并非专为C++程序员而写,但它采用了C++(以及Smalltalk)作为主要示例语言,C++程序员尤其易于从中受益。

  ●John Lakos,《Large-Scale C++ Software Design》

  中文版《大规模C++程序设计》

  ●候捷:《STL 源码剖析》

  《STL 源码剖析》是一本很有特色的书。遗憾的是,侯捷先生在完成《C++ Templates: The Complete Guide》一书的翻译后似乎决定暂时告别模板、泛型编程和STL领域。

  ●《The C++ Standard : Incorporating Technical Corrigendum No. 1》

  ●C++面向对象程序设计(作者:Walter Savitch) 这本书是老外出的书,从基础到深入,很容从C过渡到C++

  ●C++ Primer中文版(第4版)(一本久负盛名的C++经典教程)

常见错误

  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 ------------------结构体的长度为零

优点

  C++是一种绝对不会试图迎合某个模子的语言。特别是它的形式可以变化多端,以解决不同类型的问题。这主要反映在象Microsoft Visual C++和Borland C++ Builder那样的工具身上。它们将库、组件模型以及代码生成工具等合成到一起,以开发视窗化的末端用户应用(用于Microsoft Windows操作系统)。

争议

  c++语言由于过度的复杂性,以及与unix的文化相抵触,在unix/linux领域受到很多著名人士(比如Linux之父linus torvalds与著名黑客Eric S. Raymond)的强烈批评与抵制。

  参见《unix编程艺术》对c++的批评.

转载于:https://www.cnblogs.com/ruanjianxiaohu/archive/2011/08/21/2147722.html

认识C++(引别人的)相关推荐

  1. public,private,protected访问权限在Java,C++中的解析

    Java中: Java中的访问权限有public,private,protected和默认的包访问权限,如果类中的属性方法没有显示的指明访问权限,则具有包访问权限,我喜欢称它为packeged权限,很 ...

  2. 区块链正本清源 – 从计算机科学评看区块链的起源和发展

    比特币在理论上并没有解决计算机科学上的共识问题,是用经济杠杆促成的实用系统:比特币链的结算慢速是有根据的特殊设计,是不可以加速的:以太坊不可能作为通用链支持全世界的应用: 以太坊这么做智能合约是不科学 ...

  3. 论文的写作要求、流程与写作技巧

    论文的写作要求.流程与写作技巧 广义来说,凡属论述科学技术内容的作品,都称作科学著述,如原始论著(论文).简报.综合报告.进展报告.文献综述.述评.专著.汇编.教科书和科普读物等.但其中只有原始论著及 ...

  4. 用户思维模型,围绕用户核心四大模块,拉新、养熟、成交、裂变循环的效果...

    用户思维模型,围绕用户核心四大模块,拉新.养熟.成交.裂变循环的效果 用户思维模型 1.拉新 越勾引人的诱惑设计,借力软文.好友.大V.媒体等推广的方法来获得源源不断高质量的粉丝,给予别人有价值的东西 ...

  5. 把16进制转换为ascii字符c语言,ASCII转16进制C语言

    满意答案 u2gseftj278 推荐于 2016.03.01 采纳率:56%    等级:11 已帮助:14340人 以前引别人的,自己懒得再写了呵呵.原理就是这样的,你可以直接用的 //函 数 名 ...

  6. MBTI性格类型测试

    MBTI性格类型测试 注意事项: 1.请在心态平和及时间充足的情况下才开始答题. 2.每道题目均有两个答案: A和 B.请仔细阅读题目,按照与你性格相符的程度分别给 A和 B赋予一个分数,并使一组中的 ...

  7. 诸葛 理解产品、交互和运营

    我们总是能听到创业者谈到重产品和重运营 这两个词,但是很少有人能真正理解和作出正确的判断. 我也遇到过求职者同时投产品和运营,用的却是同一份简历和求职信.另外还有更多的人分不清产品经理加交互设计师的, ...

  8. C++的异常[转载]

    C++的异常[转载] 转自:http://www.cnblogs.com/CUCmehp/archive/2009/01/12/1374320.html C++函数后面后加到关键字throw(some ...

  9. C++的异常(转载 )

    C++函数后面后加到关键字throw(something)限制,是对这个函数的异常安全性作出限制. void f() throw()  表示f不允许抛出任何异常,即f是异常安全的. void f() ...

最新文章

  1. AI顶级会议以及期刊
  2. URI,URL和URN有什么区别?
  3. linux默认开启sudo_Sudo漏洞允许非特权Linux和macOS用户以root身份运行命令
  4. devops开发模式流程图_2020 Web开发人员路线图–成为前端,后端或DevOps开发人员的视觉指南
  5. 机器学习中遇到的问题
  6. Spring 事务 状态信息的创建、回滚、清理、提交
  7. python编写登录接口_使用python编写一个登录接口
  8. excel表格乱码修复_修复从数据库复制的空白Excel单元格
  9. 利用docker容器ubuntu安装truecrypt
  10. 2022华为杯研赛E题草原放牧策略研究代码+思路
  11. 防火墙的三种工作模式介绍(路由模式、透明模式(网桥)、混合模式)
  12. 骇客基础_骇客基础知识:第3部分
  13. 数据清洗第六章—课后操作题
  14. Android UI换皮肤或 白天黑夜模式
  15. 每天五分钟玩转K8S(二)
  16. 数据结构—约瑟夫环问题(C语言版)
  17. 论文解读:Foreground-Aware Relation Network for Geospatial Object Segmentation in High Spatial Resolution
  18. linux 编译安装TRMPdump(libRTMP)
  19. smartupload工具上传文件
  20. Android应用开发之AbsoluteLayout(绝对布局)

热门文章

  1. java实现12306查票_[转]java抓取12306信息实现火车余票查询示例firefox
  2. 三菱fx3u型PLC和昆仑通泰MCGS触摸屏控制松下伺服电机控制程序
  3. 如何下载O2OA办公开发平台?
  4. Linux FTP服务安装步骤
  5. 【Linux】网络套接字编程
  6. 3dmax如何删除单个着色器清空素材
  7. 手把手Selenium安装使用及实战爬取前程无忧招聘网站(一)
  8. 辽宁2009对口计算机试题文档之家,2011年对口高考计算机试题
  9. 回溯算法解决智能拼图的最小步骤的问题
  10. 股票质押式回购 非担保交收 结算备付金 B股转H股