多文件工程和编译预处理命令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
表示按照标准方式搜索要包含的文件,该文件位于C++ 系统目录的include子目录下,一般要包含系统提供的标 准文件时采用这种方式。
2、#include “文件名” 例如:#include “Circle.h”
表示在当前目录下搜索要包含的文件,如果没有再按 标准方式搜索,用户自己编写的文件一般采用这种方式。
7.3.4 命名空间的使用
7.3.5 命名空间的嵌套
4
目录(续)
7.4 编译预处理
7.4.1 在程序中包含头文件 7.4.2 程序中的置换 7.4.3 条件预编译
本章主要考点
• 多文件工程的基本组成 • 外部函数及外部变量的基本概念
• 无参宏定义及带参宏定义
7.1 多文件工程
多文件结构(对于比较复杂的程序)
7.2 外部变量与外部函数
30
例7-2(续)
//B.cpp #include "B.h" extern double nInitValue ; extern void ShowMessage(); B::B() { nValue = nInitValue; ShowMessage(); } 注 意 这 里 B.cpp: B类类成员函数的 具体实现
7.1 多文件工程
注意include有两种书写方式:
1、#include <文件名> 例如:#include <iostream>
表示按照标准方式搜索要包含的文件,该文件位于C++ 系统目录的include子目录下,一般要包含系统提供的标 准文件时采用这种方式。
2、#include “文件名” 例如:#include “Circle.h”
具体格式如下: 外部变量:extern 变量名; 外部函数:extern 函数名;
7.2 外部变量与外部函数
27
例7-2: 外部变量和外部函数的声明和使用
//A.h class A A.h: { A类的定义文件 private: double nValue; public: A( ); double GetValue() {return nValue;} };
• 一个源程序可以划分为多个源文件:
▫ 类声明文件(.h文件) ▫ 类实现文件(.cpp文件) ▫ 类的使用文件(main()所在的.cpp文件)
• 利用工程来组合各个文件。
图解:用VC建立多文件的工程
向工程中添加文件
பைடு நூலகம் 16
多文件工程的好处
• • • • 将类和函数的定义与对它们的使用分离 将类的声明和类的实现分离 便于分工合作 便于软件的维护
7.4 编译预处理
44
7.4.2 程序中的置换
• 程序中的置换包括符号置换和宏置换。 • C语言中,常用符号置换定义符号常量,宏定义 常用来实现简单的函数计算。
7.4 编译预处理
45
符号置换
• 符号常量定义格式为:
▫ #define 标识符 字符序列 ▫ 如:#define PI 3.14159265
B.仅仅搜索源程序所在目录
C.仅仅搜索当前目录 D.直接按系统设定的标准方式搜索目录
自测题:
• 在文件包含预处理语句( #include )的使用形式 中,当之后的文件名用 < > (尖括号)括起时, 寻找被包含文件的方式是 ( )。 A. 仅仅搜索源程序所在目录
B. 直接按系统设定的标准方式搜索目录
7.1 多文件工程
18
例7-1(续)
//文件2,类的实现, Circle.cpp #include ”Circle.h” Circle::Circle(float r): radius(r) { } float Circle::Circumference( ) { return 2.0 * 3.14 * radius; } float Circle::Area( ) { return 3.14 * radius * radius; }
符号定义和宏定义 重新定义当前行和文件名 产生编译时错误消息 提 供机 器专用 特性 ,同时 保证 与 C++的完全兼容
7.4 编译预处理
41
7.4.1 在程序中包含头文件(文件包含)
• 头文件是外部文件,通常存储在磁盘上,其内容 可以通过#include预处理指令包含的程序中。
▫
▫
例如: #include <iostream>
7.1 多文件工程
17
例7-1: 设计一个圆类,并计算圆的面积和周长
//文件1,类的定义,Circle.h #include <iostream> using namespace std; class Circle Circle.h: { Circle类的定义文 private: 件,定义了类的使 float radius; //圆半径 用接口 public: Circle(float r); //构造函数 float Circumference( ); //计算圆周长 float Area( ); //计算圆面积 };
外部存储类型小结 • 问题的提出: ▫ 一个文件如何使用另一个文件中的变量、 函数?
1.cpp文件 int a = 199;
定义变量a
2.cpp文件 3.cpp文件 #include <iostream.h> #include <iostream.h> extern int a; extern int a; extern void f(); void f() int main() { { cout<<"f:"<<a; cout<<"main:"<<a; cout<<endl; cout<<endl; } f(); } 编译器遇到extern int a;它会在这三个文件中找 变量a的定义,在1.cpp文件中找到了。
Circle.cpp: Circle类成员函数 的具体实现
7.1 多文件工程
19
例7-1(续)
//文件3, 主函数,7_1.cpp
运行结果:
Circumference = 31.4 #include "Circle.h" Area = 78.5 int main() { Circle cr(5.0); cout<<"Circumference = "<<cr.Circumference()<<endl; cout<<"Area = "<<cr.Area()<<endl; return 0; 使用Circle类的源程 } 序文件
7.4 编译预处理
编译预处理
• 编译预处理是把C++代码编译为机器指令之前执 行的一个过程。
▫ 文件包含 ▫ 程序中的置换 ▫ 条件预编译
7.4 编译预处理
40
C++预处理指令集
预处理指令 #include #if #else #elif #endif #if defined(或#ifdef) #if !defined(或#ifnedf) #define #undef #line #error #pragma 功能 包含头文件 条件编译
7.2 外部变量与外部函数
注 //A.cpp 意 #include "A.h" 这 里 #include <iostream> A.cpp: using namespace std; double nInitValue = 10.0; A类类成员函数的 void ShowMessage( ) 具体实现 { cout <<"The ShowMessage function has been called"<<endl; }
表示在当前目录下搜索要包含的文件,如果没有再按 标准方式搜索,用户自己编写的文件一般采用这种方式。
自测题:
• 在文件包含预处理语句(#include)的使用形式中,当之 后的文件名用 " " (双括号)括起时,寻找被包含文件的 方式是 ( )。 A.先在源程序所在目录搜索,再按系统设定的标准方式 搜索
• C++中,定义符号常量更好的办法是用const来定 义,
▫ 如:const double pi = 3.14159265;
7.4 编译预处理
46
宏置换
• 宏定义格式
▫
#define 标示符(参数列表) 替换字符串 如:#define MAX(a,b) (a>b?a:b) 当程序中出现如下语句: c = MAX(a,b); 预编译过程会把它替换为: c = (a>b?a:b); C++中这一功能已被内联函数取代。 #undef 用于取消对标识符和宏的定义。
#include<标准库头文件>
• 文件包含一般形式如下
• 把自己的源文件包含在程序中,此时文件名要放 在双引号中
▫ 例如:#include ”Circle.h”
文件包含是怎么一回事?
7.1 多文件工程
复习:注意include有两种书写方式
1、#include <文件名> 例如:#include <iostream>
7.2 外部变量与外部函数
31
例7-2(续)
//7-2.cpp #include "A.h" 运行结果: #include "B.h" The ShowMessage function has been called #include <iostream> The ShowMessage function has been called using namespace std; nValue of Test1 is: 10 nValue of Test2 is: 10 void main() { A a; B b; cout << "nValue of A is: "<<a.GetValue()<<endl; cout << "nValue of B is: "<<b.GetValue()<<endl; }
一个C++ 源文件
翻译临时 文件 预处理 编译
目标文件 obj
连接
7.2 外部变量与外部函数
26
外部变量与外部函数
• 对于大型复杂程序一般采用多文件工程,也就是 一个工程由多个文件构成,但有时候我们在一个 文件中定义的变量或函数,希望能够被其他文件 共享, 这时候我们就要把该变量或函数定义为外 部变量或外部函数。 • 声明外部变量和外部函数
▫ ▫ ▫ ▫
7.4 编译预处理
47
取消置换
• #undef 用于取消对标识符和宏的定义。 ▫ #undef PI ▫ #undef MAX
7.4 编译预处理——7.4.2程序中的置换
48
例7-8:简单宏替换预处理指令(#define)
#include <iostream> using namespace std; #define YES 1 #define PI 3.1415926 #define RAD PI/180 #define MESG “This is a string” #define PRINT(k) cout <<(k)<<endl #define MAX(a,b) (a>b?a:b) #define CC(a,b) a*b #define CCC(a,b) (a)*(b)
自测题:
• 关于外部变量的下列说法错误的是 ( )。 A.函数外定义的变量,其前若用static修饰,则不能 作为外部变量 B.外部变量只需要在一个文件中定义一次,但可以 其他文件中多次声明 C.只要在主函数外面定义的变量就一定是外部变量 D.外部变量在其他文件中被使用时需要用extern进 行事先声明
C. 仅仅搜索当前目录 D. 先在源程序所在目录搜索,再按系统设定的标 准方式搜索
补充小知识: 1、一个C++源文件如何生成exe可执行文件?
一个C++ 源文件 翻译临时 文件 目标文件 obj exe可执 行文件
预处理
编译
连接
2、多个C++源文件如何生成一个exe可执行文件?
一个C++ 源文件 翻译临时 文件 预处理 编译 目标文件 obj exe可执 行文件
C++教程
第七章 多文件工程和编译预处 理命令
清华大学 郑 莉
2
学习目标
• 掌握多文件工程的组织和应用方法; • 掌握外部变量和外部函数的定义与使用; • 了解各种预编译指令的功能。
3
目录
7.1 多文件工程
7.2 外部变量与外部函数
7.3 标准C++库和命名空间
7.3.1 标准C++库 7.3.2 什么是命名空间 7.3.3 命名空间的定义
28
A::A() { nValue = nInitValue; ShowMessage(); }
7.2 外部变量与外部函数
29
例7-2(续)
//B.h class B B.h: { private: B类的定义文件 double nValue; public: B( ); double GetValue ( ) {return nValue;} };
2、#include “文件名” 例如:#include “Circle.h”
表示在当前目录下搜索要包含的文件,如果没有再按 标准方式搜索,用户自己编写的文件一般采用这种方式。
7.3.4 命名空间的使用
7.3.5 命名空间的嵌套
4
目录(续)
7.4 编译预处理
7.4.1 在程序中包含头文件 7.4.2 程序中的置换 7.4.3 条件预编译
本章主要考点
• 多文件工程的基本组成 • 外部函数及外部变量的基本概念
• 无参宏定义及带参宏定义
7.1 多文件工程
多文件结构(对于比较复杂的程序)
7.2 外部变量与外部函数
30
例7-2(续)
//B.cpp #include "B.h" extern double nInitValue ; extern void ShowMessage(); B::B() { nValue = nInitValue; ShowMessage(); } 注 意 这 里 B.cpp: B类类成员函数的 具体实现
7.1 多文件工程
注意include有两种书写方式:
1、#include <文件名> 例如:#include <iostream>
表示按照标准方式搜索要包含的文件,该文件位于C++ 系统目录的include子目录下,一般要包含系统提供的标 准文件时采用这种方式。
2、#include “文件名” 例如:#include “Circle.h”
具体格式如下: 外部变量:extern 变量名; 外部函数:extern 函数名;
7.2 外部变量与外部函数
27
例7-2: 外部变量和外部函数的声明和使用
//A.h class A A.h: { A类的定义文件 private: double nValue; public: A( ); double GetValue() {return nValue;} };
• 一个源程序可以划分为多个源文件:
▫ 类声明文件(.h文件) ▫ 类实现文件(.cpp文件) ▫ 类的使用文件(main()所在的.cpp文件)
• 利用工程来组合各个文件。
图解:用VC建立多文件的工程
向工程中添加文件
பைடு நூலகம் 16
多文件工程的好处
• • • • 将类和函数的定义与对它们的使用分离 将类的声明和类的实现分离 便于分工合作 便于软件的维护
7.4 编译预处理
44
7.4.2 程序中的置换
• 程序中的置换包括符号置换和宏置换。 • C语言中,常用符号置换定义符号常量,宏定义 常用来实现简单的函数计算。
7.4 编译预处理
45
符号置换
• 符号常量定义格式为:
▫ #define 标识符 字符序列 ▫ 如:#define PI 3.14159265
B.仅仅搜索源程序所在目录
C.仅仅搜索当前目录 D.直接按系统设定的标准方式搜索目录
自测题:
• 在文件包含预处理语句( #include )的使用形式 中,当之后的文件名用 < > (尖括号)括起时, 寻找被包含文件的方式是 ( )。 A. 仅仅搜索源程序所在目录
B. 直接按系统设定的标准方式搜索目录
7.1 多文件工程
18
例7-1(续)
//文件2,类的实现, Circle.cpp #include ”Circle.h” Circle::Circle(float r): radius(r) { } float Circle::Circumference( ) { return 2.0 * 3.14 * radius; } float Circle::Area( ) { return 3.14 * radius * radius; }
符号定义和宏定义 重新定义当前行和文件名 产生编译时错误消息 提 供机 器专用 特性 ,同时 保证 与 C++的完全兼容
7.4 编译预处理
41
7.4.1 在程序中包含头文件(文件包含)
• 头文件是外部文件,通常存储在磁盘上,其内容 可以通过#include预处理指令包含的程序中。
▫
▫
例如: #include <iostream>
7.1 多文件工程
17
例7-1: 设计一个圆类,并计算圆的面积和周长
//文件1,类的定义,Circle.h #include <iostream> using namespace std; class Circle Circle.h: { Circle类的定义文 private: 件,定义了类的使 float radius; //圆半径 用接口 public: Circle(float r); //构造函数 float Circumference( ); //计算圆周长 float Area( ); //计算圆面积 };
外部存储类型小结 • 问题的提出: ▫ 一个文件如何使用另一个文件中的变量、 函数?
1.cpp文件 int a = 199;
定义变量a
2.cpp文件 3.cpp文件 #include <iostream.h> #include <iostream.h> extern int a; extern int a; extern void f(); void f() int main() { { cout<<"f:"<<a; cout<<"main:"<<a; cout<<endl; cout<<endl; } f(); } 编译器遇到extern int a;它会在这三个文件中找 变量a的定义,在1.cpp文件中找到了。
Circle.cpp: Circle类成员函数 的具体实现
7.1 多文件工程
19
例7-1(续)
//文件3, 主函数,7_1.cpp
运行结果:
Circumference = 31.4 #include "Circle.h" Area = 78.5 int main() { Circle cr(5.0); cout<<"Circumference = "<<cr.Circumference()<<endl; cout<<"Area = "<<cr.Area()<<endl; return 0; 使用Circle类的源程 } 序文件
7.4 编译预处理
编译预处理
• 编译预处理是把C++代码编译为机器指令之前执 行的一个过程。
▫ 文件包含 ▫ 程序中的置换 ▫ 条件预编译
7.4 编译预处理
40
C++预处理指令集
预处理指令 #include #if #else #elif #endif #if defined(或#ifdef) #if !defined(或#ifnedf) #define #undef #line #error #pragma 功能 包含头文件 条件编译
7.2 外部变量与外部函数
注 //A.cpp 意 #include "A.h" 这 里 #include <iostream> A.cpp: using namespace std; double nInitValue = 10.0; A类类成员函数的 void ShowMessage( ) 具体实现 { cout <<"The ShowMessage function has been called"<<endl; }
表示在当前目录下搜索要包含的文件,如果没有再按 标准方式搜索,用户自己编写的文件一般采用这种方式。
自测题:
• 在文件包含预处理语句(#include)的使用形式中,当之 后的文件名用 " " (双括号)括起时,寻找被包含文件的 方式是 ( )。 A.先在源程序所在目录搜索,再按系统设定的标准方式 搜索
• C++中,定义符号常量更好的办法是用const来定 义,
▫ 如:const double pi = 3.14159265;
7.4 编译预处理
46
宏置换
• 宏定义格式
▫
#define 标示符(参数列表) 替换字符串 如:#define MAX(a,b) (a>b?a:b) 当程序中出现如下语句: c = MAX(a,b); 预编译过程会把它替换为: c = (a>b?a:b); C++中这一功能已被内联函数取代。 #undef 用于取消对标识符和宏的定义。
#include<标准库头文件>
• 文件包含一般形式如下
• 把自己的源文件包含在程序中,此时文件名要放 在双引号中
▫ 例如:#include ”Circle.h”
文件包含是怎么一回事?
7.1 多文件工程
复习:注意include有两种书写方式
1、#include <文件名> 例如:#include <iostream>
7.2 外部变量与外部函数
31
例7-2(续)
//7-2.cpp #include "A.h" 运行结果: #include "B.h" The ShowMessage function has been called #include <iostream> The ShowMessage function has been called using namespace std; nValue of Test1 is: 10 nValue of Test2 is: 10 void main() { A a; B b; cout << "nValue of A is: "<<a.GetValue()<<endl; cout << "nValue of B is: "<<b.GetValue()<<endl; }
一个C++ 源文件
翻译临时 文件 预处理 编译
目标文件 obj
连接
7.2 外部变量与外部函数
26
外部变量与外部函数
• 对于大型复杂程序一般采用多文件工程,也就是 一个工程由多个文件构成,但有时候我们在一个 文件中定义的变量或函数,希望能够被其他文件 共享, 这时候我们就要把该变量或函数定义为外 部变量或外部函数。 • 声明外部变量和外部函数
▫ ▫ ▫ ▫
7.4 编译预处理
47
取消置换
• #undef 用于取消对标识符和宏的定义。 ▫ #undef PI ▫ #undef MAX
7.4 编译预处理——7.4.2程序中的置换
48
例7-8:简单宏替换预处理指令(#define)
#include <iostream> using namespace std; #define YES 1 #define PI 3.1415926 #define RAD PI/180 #define MESG “This is a string” #define PRINT(k) cout <<(k)<<endl #define MAX(a,b) (a>b?a:b) #define CC(a,b) a*b #define CCC(a,b) (a)*(b)
自测题:
• 关于外部变量的下列说法错误的是 ( )。 A.函数外定义的变量,其前若用static修饰,则不能 作为外部变量 B.外部变量只需要在一个文件中定义一次,但可以 其他文件中多次声明 C.只要在主函数外面定义的变量就一定是外部变量 D.外部变量在其他文件中被使用时需要用extern进 行事先声明
C. 仅仅搜索当前目录 D. 先在源程序所在目录搜索,再按系统设定的标 准方式搜索
补充小知识: 1、一个C++源文件如何生成exe可执行文件?
一个C++ 源文件 翻译临时 文件 目标文件 obj exe可执 行文件
预处理
编译
连接
2、多个C++源文件如何生成一个exe可执行文件?
一个C++ 源文件 翻译临时 文件 预处理 编译 目标文件 obj exe可执 行文件
C++教程
第七章 多文件工程和编译预处 理命令
清华大学 郑 莉
2
学习目标
• 掌握多文件工程的组织和应用方法; • 掌握外部变量和外部函数的定义与使用; • 了解各种预编译指令的功能。
3
目录
7.1 多文件工程
7.2 外部变量与外部函数
7.3 标准C++库和命名空间
7.3.1 标准C++库 7.3.2 什么是命名空间 7.3.3 命名空间的定义
28
A::A() { nValue = nInitValue; ShowMessage(); }
7.2 外部变量与外部函数
29
例7-2(续)
//B.h class B B.h: { private: B类的定义文件 double nValue; public: B( ); double GetValue ( ) {return nValue;} };