C++预处理程序命令及名空间使用

2018-11-02  本文已影响0人  王的for

一、预处理程序命令简介

预处理程序命令是以“#”开头并占用一整行的命令,预处理命令位于程序的开始,供编译程序的预处理器处理。

(1)使用预处理程序命令主要目的:减少源程序代码。

(2)源文件在编译过程的流程:编译程序的预处理器对源文件的预处理命令进行处理-->处理结果再传送给编译程序进行编译。

二、C++提供了三种预处理命令

1、宏定义命令(定义宏#define PI 3.14,当编译程序的预处理器在后续代码中遇到与第一个参数PI相对应的符号时,预处理器就用第二个参数3.14替换该符号PI。)

2、文件包含命令#include(指示编译程序的预处理器在编译程序所在目录时将头文件插进来。#include "c:\mydir\work.h"自定义的头文件or其他文件,需要导入时用#inlcude"",必须用到双引号而不是<>。)

区别:1)、#include<xx.h>是默认去系统目录查找头文件,引用系统头文件  

           2)、#include "xx.h"去当前代码所在目录查找xx.h文件,没有再去系统目录查找。可以使用#include "c:\mydir\work.h"导入具体目录下的头文件,也可以导入其他文件。

3、条件编译命令#ifdef....#endif

可以在头文件最上部加上

#ifndef _xxx_h

#define _xxx_h

class XXX //类说明

class XXX

{

    .......

};

#endif

可以保证在同一个源文件中只被include一次。

三、名空间的使用

C++为了避免标识符命名冲突而引入名空间。如果要使得不同名空间的标识符不发生冲突,需要完整访问一个标识,必须采用“名空间::标识符名称”的形式。

比如:std::cout<<"hello cpp"<<std:endl

如果在代码前面加上using namespace std;这句话告诉编译程序当前的全局名空间为std名空间,这样程序后续代码若使用到了cout对象标识,可不加std::

可以直接写成:

using namespace std;

cout<<"hello cpp"<<endl

(1)自定义自己的名空间

using namespace std;

namespace fathernamespace {

    char isHandsome;

}

namespace childnamespace {

    using namespace fathernamespace;

}

using namespace childnamespace;

intmain(intargc,constchar* argv[]) {

    cin>>isHandsome;

    //cin>>childnamespace::isHandsome;

    cout<<"child is "<<isHandsome<<endl;

    return 0;

}

四、C++编译过程

1)预处理过程:编译程序的预处理器对源文件中的预处理命令和注释行进行处理,并将结果交给编译器程序进行编译

2)编译过程:

(1)词法分析:对由字符组成的单词进行分析,发现错误并报告。

(2)语法分析:按照C++语言的规则来分析检测每条语句的逻辑结构是否正确,发现错误并报告。

(3)建立符号表:将源代码中的标识符及属性进行映射。比如变量名称、类型、所占用内存大小和所分配的内存物理地址等。

(4)错误处理,根据错误性质分级别提示等。

(5)生成目标代码:生成一个与源文件同名的.obj(后缀)目标代码文件。

目标文件.obj进过连接处理,在连接阶段遇到C++标准库函数的调用时,连接程序会将已经预编译好了的库函数从C++库文件中加入到目标代码.obj中,最后结果:生成.exe的可执行程序文件。

上一篇 下一篇

猜你喜欢

热点阅读