Part5 数据的共享与保护 5.6多文件结构和预编译命令

Posted LeoSirius

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Part5 数据的共享与保护 5.6多文件结构和预编译命令相关的知识,希望对你有一定的参考价值。

C++程序的一般组织结构:
  1 一个工程可以划分为多个源文件:
    类声明文件(.h文件)
    类实现文件(.cpp文件)
    类的使用文件(main()所在的.cpp文件)
  2 利用工程来组合各个文件。

//多文件的工程
//文件1,类的定义,Point.h
class Point{
public:
    Point(int x = 0, int y = 0):x(x),y(y){count++;}
    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,主函数
#include "Point.h"
#include<iostream>
using namespace std;
int main(){
    Point a(4,5);
    cout << "Point A:" << a.getX() << ", " << a.getY();
    Point::showCount();
    Point b(a);
    cout << "Point B:" << b.getX() << ", " << b.getY();
    Point::showCount();
    return 0;
}

 

外部变量
  如果一个变量除了在定义它的源文件中可以使用外,还能被其它文件使用,那么就称这个变量是外部变量。
  文件作用域中定义的变量,默认情况下都是外部变量,但在其它文件中如果需要使用这一变量,需要用extern关键字加以声明。

外部函数
  在所有类之外声明的函数(也就是非成员函数),都是具有文件作用域的。
  这样的函数都可以在不同的编译单元中被调用,只要在调用之前进行引用性声明(即声明函数原型)即可。
  也可以在声明函数原型或定义函数时用extern修饰,其效果与不加修饰的默认状态是一样的。

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

namespace {         //匿名的命名空间
     int n;
     void f() {
        n++;
     }
}

 

标准C++类库是一个极为灵活并可扩展的可重用软件模块的集合。标准C++类与组件在逻辑上分为6种类型:
1 输入/输出类
2 容器类与抽象数据类型
3 存储管理类
4 算法
5 错误处理
6 运行环境支持

 

编译预处理:
1 #include 包含指令
  将一个源文件嵌入到当前源文件中该点处。
  #include<文件名> 按标准方式搜索,文件位于C++系统目录的include子目录下
  #include"文件名" 首先在当前目录中搜索,若没有,再按标准方式搜索。


2 #define 宏定义指令
  定义符号常量,很多情况下已被const定义语句取代。
  定义带参数宏,已被内联函数取代。

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

4 条件编译指令

#if 常量表达式1
    程序正文1  //当“ 常量表达式1”非零时编译
#elif 常量表达式2
    程序正文2  //当“ 常量表达式2”非零时编译
#else
    程序正文3  //其他情况下编译
#endif

#ifdef 标识符
    程序段1//如果“标识符”经#defined定义过,且未经undef删除,则编译程序段1
#else
    程序段2//否则编译程序段2。
#endif

#ifndef 标识符
    程序段1//如果“标识符”未被定义过,则编译程序段1
#else
    程序段2//否则编译程序段2
#endif

 

以上是关于Part5 数据的共享与保护 5.6多文件结构和预编译命令的主要内容,如果未能解决你的问题,请参考以下文章

多线程编程-- part5.1 互斥锁ReentrantLock

数据结构与算法(Python)——常见数据结构Part5(二叉搜索树BST和AVL)

数据结构与算法(Python)——常见数据结构Part5(二叉搜索树BST和AVL)

vue part5 vuex

并发编程(学习笔记-共享模型之无锁)-part5

多线程编程-- part5.1 互斥锁之公平锁-获取锁