C++ 多文件结构和编译预处理命令(第五章)

本文介绍了C++程序的多文件组织结构,包括类声明与实现的分离、外部变量与函数的使用,以及如何通过编译预处理命令进行条件编译。通过一个具体的例子展示了如何在不同的文件中定义类、实现类的方法以及主函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

多文件结构和编译预处理命令

C++程序的一般组织结构

例 5-10 多文件的工程

外部变量

外部函数

将变量和函数限制在编译单元内

标准C++库

编译预处理

l #include 包含指令

l #define 宏定义指令

l #undef

条件编译指令——#if 和 #endif

条件编译指令——#else

条件编译指令——#elif

条件编译指令


多文件结构和编译预处理命令

C++程序的一般组织结构

l 一个工程可以划分为多个源文件:

n    类声明文件(.h文件)

n    类实现文件(.cpp文件)

n    类的使用文件(main()所在的.cpp文件)

l 利用工程来组合各个文件。

例 5-10 多文件的工程

//文件1,类的定义,Point.h

class Point { //类的定义

public:          //外部接口

       Point(int x = 0, int y = 0) : x(x), y(y) { }

       Point(const Point &p);

       ~Point() { count--; }

       int getX() const { return x; }

       int getY() const { return y; }

       static void showCount();          //静态函数成员

private:         //私有数据成员

       int x, y;

       static int count; //静态数据成员

};


//文件2,类的实现,Point.cpp

#include "Point.h"

#include <iostream>

using namespace std;


int Point::count = 0;            //使用类名初始化静态数据成员


Point::Point(const Point &p) : x(p.x), y(p.y) {

       count++;

}


void Point::showCount() {

       cout << "  Object count = " << count << endl;

}


//文件3,主函数,5_10.cpp

#include "Point.h"

#include <iostream>

using namespace std;


int main() {

       Point a(4, 5);      //定义对象a,其构造函数使count增1

       cout <<"Point A: "<<a.getX()<<", "<<a.getY();

       Point::showCount();      //输出对象个数

       Point b(a);         //定义对象b,其构造函数回使count增1

       cout <<"Point B: "<<b.getX()<<", "<<b.getY();

       Point::showCount();      //输出对象个数

       return 0;

}

外部变量

l 如果一个变量除了在定义它的源文件中可以使用外,还能被其它文件使用,那么就称这个变量是外部变量。

l 文件作用域中定义的变量,默认情况下都是外部变量,但在其它文件中如果需要使用这一变量,需要用extern关键字加以声明。

外部函数

l 在所有类之外声明的函数(也就是非成员函数),都是具有文件作用域的。

l 这样的函数都可以在不同的编译单元中被调用,只要在调用之前进行引用性声明(即声明函数原型)即可。也可以在声明函数原型或定义函数时用extern修饰,其效果与不加修饰的默认状态是一样的。

将变量和函数限制在编译单元内

l 使用匿名的命名空间:在匿名命名空间中定义的变量和函数,都不会暴露给其它的编译单元。

   namespace {         //匿名的命名空间

         int n;

         void f() {

                     n++;

         }

   }

l 这里被“namespace { …… }”括起的区域都属于匿名的命名空间。

标准C++库

l 标准C++类库是一个极为灵活并可扩展的可重用软件模块的集合。标准C++类与组件在逻辑上分为6种类型:

n    输入/输出类

n    容器类与抽象数据类型

n    存储管理类

n    算法

n    错误处理

n    运行环境支持

编译预处理

l #include 包含指令

n    将一个源文件嵌入到当前源文件中该点处。

n    #include<文件名> 

–  按标准方式搜索,文件位于C++系统目录的include子目录下

n    #include"文件名"

–  首先在当前目录中搜索,若没有,再按标准方式搜索。

l #define 宏定义指令

n    定义符号常量,很多情况下已被const定义语句取代。

n    定义带参数宏,已被内联函数取代。

l #undef

n    删除由#define定义的宏,使之不再起作用。

条件编译指令——#if 和 #endif

#if  常量表达式

 //当“ 常量表达式”非零时编译

     程序正文 

#endif

......

条件编译指令——#else

  #if   常量表达式

            程序正文1   //当“ 常量表达式”非零时编译

#else

     程序正文2   //当“ 常量表达式”为零时编译

#endif

条件编译指令——#elif

#if 常量表达式1

    程序正文1  //当“ 常量表达式1”非零时编译

#elif 常量表达式2

    程序正文2  //当“ 常量表达式2”非零时编译

#else

    程序正文3  //其他情况下编译

#endif

条件编译指令

#ifdef 标识符

    程序段1

#else

    程序段2

#endif

l 如果“标识符”经#defined定义过,且未经undef删除,则编译程序段1;

l 否则编译程序段2。


#ifndef 标识符

   程序段1

#else

   程序段2

#endif

l 如果“标识符”未被定义过,则编译程序段1;

l 否则编译程序段2。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值