【C++复习】5.7 多文件结构与编译预处理命令

1、C++项目结构

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

  1. 类声明文件(.h文件)
  2. 类实现文件(.cpp文件)
  3. 类的使用文件(main()所在的.cpp文件)

用工程组合各文件

2、编译链接

编译链接过程

3、外部变量/外部函数/命名空间

外部变量

  1. 除了在定义它的源文件中可以使用外,还能被其他文件使用
  2. 文件作用域中定义的变量,默认情况下都是外部变量
  3. 在其他文件中如果需要使用,需要用extern关键字声明

外部函数

  1. 在所有类外声明的函数(非成员函数),都是具有文件作用域的
  2. 这样的函数可以在不同的编译单元中被调用
  3. 只要在调用之前进行引用性声明(声明函数原型)即可。

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

  • 在匿名命名空间中定义的变量和函数,都不会暴露给其他编译单元
  • namespace{//匿名的命名空间
        int n;
        void f(){
            n++;   
        }
    }

     

4、标准C++库

5、编译预处理

  1. #include包含指令
    1. 将一个源文件嵌入到当前源文件中该点处
    2. #include<文件名>
      1. 按标准方式搜索,文件位于C++系系统目录的include子目录下
    3. #include"文件名"
      1. 首先在当前目录中搜索,若没有,再按标准方式搜索
  2. #define宏定义指令
    1. 定义符号常量,很多情况下已被const定义语句取代
    2. 定义带参数宏,已被内联函数取代
  3. #undef
    1. 删除由#define定义的宏,使之不再起作用
  4. #if#endif(条件编译指令)
    1. 一般用在.h文件中,防止头文件被重复包含,防止变量被重复定义。或者根据常量表达式进行“部分编译”“执行部分程序”
    2. #if 常量表达式
      //当“常量表达式”非零时候编译
      这里是程序正文
      #endif
    3. #if 常量表达式
      //当“常量表达式”非零时候编译
      这里是程序正文1
      #else
      //当“常量表达式”为零时候编译
      这里是程序正文2
      #endif
    4. #ifdef 标识符
          程序段1
      #else
          程序段2
      #endif
      /*
      如果“标识符”经#define定义过,且未经#undef删除,
      则编译程序段1,否则编译程序段2
      */
    5. #ifndef 标识符
          程序段1
      #else
          程序段2
      #endif
      /*
      如果“标识符”未被定义过,
      则编译程序段1,否则编译程序段2
      //一般用在.h文件中,防止头文件被重复包含
      */

 

参考:C++语言程序设计(第5版),郑莉,清华大学

posted @ 2023-02-07 12:19  尚方咸鱼  阅读(59)  评论(0编辑  收藏  举报