C++之 程序文件和预处理

来源:互联网 发布:匡恩网络 刘晓庆 编辑:程序博客网 时间:2024/06/03 09:40

使用程序文件:

       头文件:这种文件一般用文件扩展名.h来标识。

       源文件:其扩展名通常是.cpp

       .cpp文件主要包含确定程序做什么的代码,它们由函数定义组成。

       .h文件包含函数声明(即函数原型,但不是定义)、内联函数定义、枚举和自己的类型定义,以及预处理器指令。应避免把函数定义放在.h文件中(inline函数是一个例外),否则该函数在程序中就有重复的定义,导致链错误。

       .h 文件还可以包含在两个或多个.cpp文件中共享的常量定义。

    每个.cpp文件必须包含它需要的头文件。

    在编译程序时,只编译.cpp文件,根据#include 指令,该文件包含了程序需要的头文件内容。

    编译的每个.cpp文件都会生成一个对象文件。术语"对象文件"与类对象没有任何关

系。对象文件只是包含编译器的二进制输出的文件,它常常用扩展名.obj来标识。对

象文件由链接程序组合到一个可执行模块中,该模块的扩展名通常是.exe

      

名称的隐藏:

       可以在外部作用域中定义一个与内部作用域相同的名称,此时,在内部作用域中定义的名称会遮挡了外部作用域中的名称。

访问隐藏的名称:

       可以使用作用域解析运算符::选择在外部作用域中定义的变量,而不是在当前作用域中的同名变量。

 

外部名称:
       编译器并不介意函数的定义是在同一个文件中,还是在另一个.cpp文件中,这是因为函数名在默认情况下具有外部链接属性。如果函数没有在调用它的转换单元中定义,编译器就会把这个调用标记为外部,让链接程序处理它。

       变量名是不同的。如果希望用一个名称访问当前转换单元外部的变量,就必须用extem关键字来声明该变量,如: extern double pi; 这个语句声明名称pi在当前块的外部定义,类型必须对应于定义中的类型。在extern声明中不能有初始值。但在定义变量时,若把它们声明为const,则会在默认的情况下使它们具有内部链接属性,这样就不能在其他转换单元中使用它们了,为此,在定义这些变量时,可以使用extern关键字重写这个属性。

如果给定块中的一个名称有extem声明,就不能在同一个块中定义该名称。

 

 

命名空间:

       命名空间是程序中的一个区域,该区域把一个额外的名称(即命名空间的名称)附加到该区域中的所有实体名上。两个不同的命名空间可以包含同名的实体,但这些实体是不同的,因为它们都附加了不同的命名空间名称。

       标准库是在命名空间std中定义的。这就是说,标准库中的每个外部名称都加上了前缀std 。例如,输出流的名称是std::cout。运算符::是作用域解析运算符的二元形式,上面的语句给名称coutendl 加上了修饰符,这就告诉编译器,这些名称的定义在std命名空间中。当然,本书前面的例子都使用了std 命名空间中的名称,或者为名称添加如下的using声明:

using std:: cout; 通过如下的using 指令,就可以使用命名空间中的任意名称:using namespace std;但是,这完全偏离了使用命名空间的目的,增加了不小心使用std 命名空间中的名称而出错的可能性。因此,最好使用限定的名称,或者为std 命名空间中要使用的名称加上using 声明。