02-c++ primerm 第一章 基础知识1.3-1.5-可移植性和标准、程序创建技巧以及总结

1.3 可移植性和标准

    假设您为运行Windows 2000 的老式奔腾PC编写了一个很好用的C++程序,而管理人员决定用使用不同的操作系统(如Mas OS X或Linux)和处理器(如SPARC处理器)的计算机替换它。该程序是否可以在新平台上运行呢?编译器对程序重新编译。但是否需要修改编写号的代码呢?如果在不修改代码的情况下,重新编译程序后,程序运行良好,则该程序是可移植的。

    在可移植性方面存在两个障碍,其中的一个是硬件。硬件特定的程序是不可移植的。例如,直接控制 IBM PC 视频卡的程序在涉及Sun时将“胡言乱语”(将依赖于硬件的部分放在函数模块中可以最大限度的降低可移植性问题;这样只需要重新编写这些模块即可)。
     可移植性的第二个障碍是语言上的差异。口语确实可能产生问题。约克郡的人对某个事件的描述,布鲁克林人可能就听不明白,虽然这两个地方的人都说英语。计算机语言也可能出现方言。Windows XP C++的实现于Red Hat Linux 或Macintosh OS X实现相同吗?虽然多数实现都希望其C++版本和其他版本兼容,但如果没有准确的描述语言工作方式的公开标准,这将很难做到。因此,美国国家标准局(American National Standards Institute, ANSI)在1990年设立了一个委员会(ANSI X3J16),专门负责制定C++标准(ANSI制定了C语言标准)。国际标准化组织(ISO)很快通过自己的委员会(ISO-WG-21)加入了这个行列,创建了联合组织ANSI/ISO,致力于制定C++标准。
    经过多年的努力,制定出了一个国际标准 ISO/IEC 14882:1998 ,并于1998年获得了 ISO、IEC(International Electrotechnical Committee,国际电工技术委员会)和 ANSI 的批准。该标准常被称为C++98,它不仅描述了已有的C++特性,还对该语言进行了扩展,添加了异常,运行阶段类型识别(RTTI)、模板和标准模板库(STL)。2003年,发布了C++标准第二版(IOS/IEC 14882:2003):这个新版本是一次技术性修订,这意味着它对第一版进行了整理——修订错误、减少多义性等,但没有改变语言特性。这个版本常被称为C++03。由于C++03没有改变语言特性,因此我们使用C++98表示C++98/C++2003。
    C++在不断发展。ISO标准委员会于2001年8月批准了新标准 ISO/IEC 14882:2011,该标准以前称为C++11。于C++98一样,C++11也新增了众多特性。另外,其目标是消除不一致性,让C++学习和使用起来更容易。该标准还曾被称为C++0x,最初预期x为7或8,但标准制定工作是一个令人疲倦的缓慢过程。所幸的是,可将0x视为十六进制数,这意味着委员会只需要在2015年前完成这项任务即可。根据这个度量标准,委员会还是提前完成了任务。

     ISO C++标准还是吸收了ANSI C语言标准。因为C++应尽量是C语言的超集。这意味着在理想情况下,任何有效的C程序都应是有效的C++程序。ANSI C 与对应的C++规则之间存在一些差异,但这种差异很小。实际上,ANSI C 加入例如C++首次应用的一些特性,如函数原型和类型限定符const。
       在 ANSI C 出现之前,C语言社区遵循一种事实标准,该标准基于 Kernighan和Ritchie编写的《The C Programming Language》一书,通常被称为K&R C; ANSI C 出现后,更简单的K&R C有时也被称为经典 C(Classic C)。
     ANSI C标准不仅定义了C语言,还定义了一个ANSI C 实现必须支持的标准C库。C++也使用了这个库;本书将其称为标准C库或标准库。另外,ANSI/ISO C++标准还提供了一个C++标准类库。
     最新的C标准为C99、ISO和ANSI分别于1999年和2000年批准了该标准。该标准在C语言中添加了一些C++编译器支持的特性,如新的整型。

1.3.1 C++的发展

         Stroustrup编写的《The Programming Language》包含65页的参考手册,它成了最初的C++事实标准。
         下一个事实标准是Ellis 和 Stroustrup编写的《The Annotated C++ Reference Manual》。
         C++98标准新增了大量特性,其篇幅将近800页,且包含的说明很少。
         C++11标准的篇幅长达1350也,对旧标准做了大量的补充。

1.4 程序创建的技巧

 假设您编写了一个C++程序。如何让它运行起来呢?具体步骤取决于计算机环境和使用的C++编译器,但大体如下。

     1、使用文本编辑器编写程序,并将其保存到文件中,这个文件就是程序的源代码。
     2、编译源代码。这意味这运行一个程序,将源代码翻译为主机使用的内部语言——机器语言。包含了翻译后的程序的文件就是程序的目标代码(object code)。
    3、将目标代码与其他代码链接起来。例如,C++程序通常使用库。C++库包含一系列的计算机例程(被称为函数)的目标代码,这些函数可以执行如果在屏幕上显示信息或计算平方根等任务。链接指的是将目标代码同使用的函数的目标代码以及一些标准的启动代码(startup code)组合起来,生成程序的运行阶段版本。包含该最终产品的文件被称为可执行代码。
      有些编译器要求您使用特定的标记,让其支持部分C++11特性,g++要求您编译源代码文件时使用标记-std=c++0x;
               g++ -std=c++0x use_auto.cpp

1.4.1 创建源代码文件

         本节讨论创建源代码文件的技巧,有些C++实现(如Microsoft Visual C++、Embarcadero C++ Builder、 Apple Xcode 、Open Watcom C++、Digital Mars C++和Freescale CodeWarrior)提供了集成开发环境(integrated development environments,IDE),让您能够在主程序中管理程序开发的所有步骤,包括编译。有些实现(如用于UNIX和Linux 的GNU C++、用于AIX的IBM XL C/C++、Embarcadero分发的Borland 5.5免费版本以及Digital Mars编译器)只能处理编译和链接阶段,要求在系统命令行输入命令。在这种情况下,可以使用任何文本编译器来创建和修改源代码。例如,在UNIX系统上,可以使用vi、ed、ex或emacs;在以命令提示符模式运行的Windows系统上,可以使用edlin、edit或任何程序编译器。如果将文件保存为标准ASCII文本文件 (而不是特殊的字符处理器模式),甚至可以使用字处理器。另外,还可能有IED选项,让您能够使用这些命令行编译器。
    给源文件命名时,必须使用正确的后缀,将文件标识为C++文件。这不仅告诉您该文件是C++源代码,还将这种信息告知编译器(如果UNIX编译器显示信息“bad magic number”,则表明后缀不正确)。后缀由一个句点和一个或多个字符组成,这些字符被称作扩展名。
        使用什么扩展名取决于C++实现,例如,spiffy.C是有效的UNIX C++源代码文件名。注意,UNIX区分大小写,这就意味着应使用大写的C字符。实际上,小写c扩展名也有效,但标准C才使用小写c。因此,为避免在UNIX系统上发生混淆,对于C程序应使用c,而对于C++程序则请使用C。如果不在乎多输入一两个字符,则对于某些UNIX系统,也可以使用扩展名cc和cxx。DOS比UNIX稍微简单一点,不区分大小写,因此DOS实现使用额外的字母(如表1.1所示)来区别C和C++程序.
  

1.4.2 编译和链接    

    最初,Stroustrup实现C++时,使用了一个C++到C的编译器程序,而不是开发直接的C++到目标代码的编译器。前者叫做cfront(表示C前端, C front end),它将C++源代码翻译成C源代码,然后使用一个标准C编译器对其进行编译。这种方法简化了向C的领域引入C++的过程,其他实现也采用这种方法将C++引入到其他平台。随着C++的日渐普及,越来越多的实现转向创建C++编译器,直接将C++源代码生成目标代码。这种直接方法加速了编译过程,并强调C++是一种独立(虽然有些相似)的语言。
    编译的机理取决于实现,接下来的几节将介绍一些常见的形式。这些总结概括了基本步骤,但对其具体步骤,必须查看系统文档。
1、UNIX编译和链接
     最初,,UNIX命令CC调用cfront,但cfront未能紧跟C++的发展步伐,其最后一个版本发布于1993年。当今的UNIX计算机可能没有编译器、有专门编译器或第三方编译器,这些编译器可能是商业的,也可能是自由软件,如GNU g++编译器。如果UNIX计算机上有C++编译器,很多情况下命令CC仍然管用,知识启动的编译器随系统而异。出于简化的目的,读者应假设命令CC可用,但必须认识到这一点,即对于下述讨论中的CC,可能必须使用其他命令来代替。
    请用CC命令来编译程序。名称采用大写字母,这样可以将它与标准 UNIX C编译器cc区分开来。CC编译器是命令行编译器,这意味这需要在UNIX命令行上输入编译命令。
    例如,要编译C++源代码文件spiffy.C,则应在UNIX提示符下输入如下命令
        cc spiffy.c
    如果由于技巧、努力或是幸运的因素,程序没有错误,编译器将生成一个扩展名为o的目标代码文件。在这个例子中,编译器将生成文件spiffy.o。
    接下来,编译器自动将目标代码文件传递给系统链接程序,该程序将代码与库代码结合起来,生成一个可执行文件。在默认情况下,可执行文件为a.out。如果只使用一个源文件,链接程序还将删除spiffy.o文件,因为这个文件不再需要了。要运行该程序,只要输入可执行文件的文件名即可。
    a.out
    注意,如果编译新程序,新的可执行文件a.out见覆盖已有的a.out(这是因为可执行文件占据了大量空间,因此覆盖旧的可执行文件有助于降低储存需求)。然而,如果想保留可执行文件,只需使用UNIX的mv命令来修改可执行文件的文件名即可。
    与在C语言中一样,在C++中,程序也可以包含多个文件,在这种情况下,可以通过在命令行上例如出全部文件来编译程序:
    cc my.c precious.c
   如果有多个源代码文件,则编译器将不会删除目标代码文件。这样,如果只修改了my.C文件,则可
    cc my.C precious.o
    这种重新编译my.C文件,并将它与前面编译的precious.o文件链接起来。
    可能需要显示的指出一些库。例如,要访问数学库中定义的函数,必须在命令行中加上-lm标记:
    CC usingmath.C -lm
2、Linux编译和链接
     Linux系统中最常用的编译器是g++,这是来自Free Software  的 GNU C++编译器。Linux的多数版本都包括该编译器,但并不一定总会安装它。g++编译器的工作方式很像标准UNIX编译器。例如,下面的命令将生成可执行文件a.out
    g++ spiffy.cxx
    这些版本可能要求链接C++库:
    g++ spiffy.cxx -lg++
    要编译多个源文件,只需将它们全部放到命令行中即可:
     g++ my.cxx precious.cxx
    这将生成一个名为a.out的可执行文件和两个目标代码文件my.o和precious。如果接下来修改了其中的某个源代码文件,如my.cxx,则可以使用my.ccx和precious.o来重新编译:
g++ my.cxx precious.o
       GNU编译器可以在很多平台上使用,包括基于Windows的PC和在各种平台上运行的UNIX系统。
3、Windows命令行编译器
     要在Windows PC上编译C++程序,最便捷的方法是下载一个在WIndows命令提示符模式(在这种模式下,将打开一个类似于MS-DOS的窗口)下运行的免费命令行编译器。Cygwin和MinGW都包含编译器GNU C++,且可以免费下载:它们使用的编译器名为g++。
    要使用g++编译器,首先需要打开一个命令提示符窗口。启动程序Cygwin和MinGW时,它们将自动为您打开一个命令提示符窗口。要便宜名为great.cpp的源代码文件,请在提示符下输入如下命令:
    g++ great.cpp
      如果程序编译成功,则得到的可执行文件名为a.exe。
4、Windows编译器
      WIndows产品很多而且修订频繁,无法对它们分别进行介绍。当前,最流行的是Microsoft Visual C++ 2010,可以通过免费的Microsoft Visual C++ 2010学习版获得。虽然设计和目标不同,但大多数基于Windows的C++编译器都有一些相同的功能。
    通常,必须为程序创建一个项目,并将组成程序的一个或多个文件添加到该项目中。每个厂商提供的IDE(集成开发环境)都包含于创建项目的菜单选项(可能还有自动帮助)。必须确定的非常重要的一点是,需要创建的是什么类型的程序。通常,编译器提供了很多选择,如Windows应用程序、MFC Windows应用程序、动态链接库、ActiveX控件、DOS或字符模式的可执行文件、静态库或控制台应用程序等。其中一些可能既有32为版本,又有64位版本。
    由于本书的程序都是通用的,因此应当避免要求平台特定代码的选项,如Windows应用程序。相反,应用程序以字符模式运行。具体选项取决于编译器。一般而言,应选择包含字样”控制台“、”字符模式“或”DOS可执行文件“等选项。例如,在Microsoft Visual C++ 2010中,应选择Win32 Console Application(控制台应用程序)选项,单击Application Settings(应用程序设置),并选择 Empty Project(空项目)。在C++ Builder中,应从C++ Builder Projects(C++ Builder项目)中选择Console Application (控制台应用程序)。
    创建好项目后,需要对程序进行编译和链接。IDE通常提供了多个菜单项,如Compile(编译)、Build(建立)、Make(生成)、Build All(全部建立)、Link(链接)、Execute(执行)、Run(运行)和Debug(条式),不过同一个IDE中,不一定包含所有这些选项。
  • Compile通常意味着对当前打开的文件中的代码进行编译。
  • Build和Make通常意味着编译项目中所有源代码文件的代码。这通常是一个递增的过程,也就是说,如果项目包含3个文件,而只有其中一个文件被修改,则只重新编译该文件。
  • Build All通常意味着重新编译所有的源代码文件。
  • Link意味着(如前所述)将编译后的源代码于所需的库代码组合起来。
  • Run或Execute意味着运行程序。通常,如果您还没有执行前面的步骤,,Run将在运行程序之前完成这些步骤。
  • Debug意味着以步进方式执行程序。
  • 编译器可能让您选择要生成调试版还是发布版。调试版包含额外的代码,这会增大程序、降低执行速度,但可提供详细的调试信息。
     如果程序违反了语言规则,编译器将生成错误信息,指出存在问题的行。遗憾的是,如果不熟悉语言,将难以理解这些消息的含义。有时,真正的问题可能在标识行之前;有时,一个错误可能引发一连串的错误信息。
提示:改正错误时,应首先改正第一个错误。如果在标识为有错误的那一行上找不到错误,请查看前一行。
    需要注意的是,程序能够通过某个编译器的编译并不意味着它是合法的C++程序;同样,程序不能通过某个编译器也并不意味着它是非法的C++程序。与几年前相比,现在的编译器更严格地遵循了C++标准。另外,编译器通常提供了可用于控制严格程度的选项。
提示:有时,编译器在不完全地构建程序后将出现混乱,它显示无法改正的、无意义的错误信息。在这种情况下,可以选择Build All,重新编译整个程序,以清除这些错误信息。遗憾的是,这种情况和那些更常见的情况(即错误信息只是看上去无意义)很难区分。
     通常,IDE允许在辅助窗口中运行程序。程序执行完毕后,有些IDE将关闭该窗口,而有些IDE不关闭。如果编译器关闭窗口,将很难看到程序输出,除非您眼疾手快、过目不忘。为查看输出,必须在程序的最后加上一些代码:
          cin.get();     //add this statement
        cin.get();     //add maybe this,too
           return 0;
      }
     cin.get()语句读取下一次键击,因此上述语句让程序等待,知道按下Enter键(在按下Enter键之前,键击将不被发送给程序,因此按其他键都不管用)。如果程序在其常规输入后留下一个没被处理的键击,则第二条语句是必须的。例如,如果要输入一个数字,则需要输入该数字,然后按下Enter键。程序将读取该数字,但Enter键不被处理,这样它将被第一个cin.get()读取。
5、Macintosh 上的C++
     当前,Apple随操作系统Mac OS X提供了开发框架Xcode,该框架是免费的,但通常不会自动安装。要安装它,可使用操作系统安装盘,也可以从Apple网站免费下载(但需要注意的是,它超过4GB)。Xcode不仅提供了支持多种语言的IDE,还自带了两个命令行编译器(g++和clang),可在UNIX模式下运行它们。而要进入UNIX模式,可通过实用程序Terminal。
提示:为节省时间,可对所有示例程序使用同一个项目。方法是从项目列表中删除前一个示例程序的源代码文件,并添加当前的源代码。这样可以节省时间、工作量和磁盘空间。

1.5 总结

     随着计算机的功能越来越强大,计算机程序越来越庞大而复杂。为应对这种挑战,计算机语言也得到了改进,以便编程过程更为简单。C语言新增了诸如控制结构和函数等特性,以便更好地控制程序流程,支持结构化和模块化程度更高的方法;而C++增加了对面向对象编程和泛型编程的支持,着有助于提高模块化和创建可重用代码,从而节省编程时间并提高程序的可靠性。

   C++的流行导致大量用于各种计算平台的C++实现得以面世;而ISOC++标准(C++98/03和C++11)为确保众多实现的相互兼容提供了基础。这些标准规定了语言必须具备的特性、语言呈现出的行为、标准库函数、类和模板,旨在实现该语言在不同计算平台和实现之间的可移植性。

    要创建C++程序,可创建一个或多个源代码文件,其中包含了以C++语言表示的程序。这些文件是文本文件,它们经过编译和链接后将得到机器语言文件,后者构成了可执行文件的编译器和链接器以及其他资源,如项目管理和调试功能。然而,这些任务也可以在命令行环境中通过调用合适的工具来完成。

猜你喜欢

转载自blog.csdn.net/qq_41200424/article/details/80271863