一、预处理程序命令简介
预处理程序命令是以“#”开头并占用一整行的命令,预处理命令位于程序的开始,供编译程序的预处理器处理。
(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的可执行程序文件。