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版),郑莉,清华大学

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

  1. C++——多文件结构和编译预处理命令

    [toc] 一.多文件结构 1.一个工程可以划分为多个源文件 类声明文件(.h文件) 类实现文件(.cpp文件) 类的使用文件(main函数所在的.cpp文件) 2.利用工程来组合各个文件 //Poi ...

  2. 编译预处理命令--define和ifdef的使用

    这里将对常用的预处理命令进行学习. 一.宏定义  ·defined 格式:`defined     宏名      数值 或者 `define      宏名 注意:后面没有‘;‘,和单片机不一样: ...

  3. C/C++编译预处理命令详解【转】

    1.       预处理程序  按照ANSI标准的定义,预处理程序应该处理以下指令: #if #ifdef #ifndef #else #elif #endif #define #undef #lin ...

  4. 编译预处理命令define

    #include 包含指令 将一个源文件嵌入到当前源文件中该点处. #include<文件名>  按标准方式搜索,文件位于C++系统目录的include子目录下 #include" ...

  5. c语言编译预处理和条件编译执行过程的理解

    在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令.预处理命令属于C语言编译器,而不是C语言的组成部分.通过预处理命令可扩展C语言程序设计的环境. 一.预处理的工作方式 1.1. ...

  6. C预编译, 预处理, C/C++头文件, 编译控制,

    在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...

  7. Verilog学习笔记基本语法篇(十二)········ 编译预处理

    h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...

  8. 重编译Linux命令源代码

    转: http://blog.csdn.net/endoresu/article/details/6967435 以su命令为例. 查看su命令的路径: # which su /bin/su 查看su ...

  9. 编译u-boot命令和u-boot常用命令

    一.编译u-boot命令 1.配置开发板 #make TQ2440_config 2.编译 #make all 3.交叉编译器是crosstools_3.4.5_softfloat” 使用4.3.3版 ...

  10. 编译预处理 -- 带参数的宏定义--【sky原创】

    原文:编译预处理 -- 带参数的宏定义--[sky原创] 如有转载请注明出处   编译预处理  --  带参数的宏定义 前面为输出文件,后面为输入文件 gcc -E -o test.i test.c ...

随机推荐

  1. vue+element form 动态改变rules校验数据

    优化:确定secondRules的数据在secondFlag改变之前进行赋值 可以用$nextTick来执行,不用setTimeOut ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  2. js数字取整的方法

    parseInt(123.34)=123(保留整数) Math.ceil(123.34)=124(向上取整) Math.floor(123.34)=123(向下取整) Math.round(123.3 ...

  3. Linux与Windows对比

    1. 前言 Windows是微软为个人台式机/设备或电脑(PC)开发的一系列操作系统.计算机操作系统(OS).每个操作系统都有一个图形用户界面(GUI),桌面允许用户查看所有文件.视频等.Window ...

  4. poi 5.2 导出

    如果能给你带来帮助,不胜荣幸,如果有错误也请批评指正. 1:maven 依赖,现在好多都是用的poi 3.6 和 poi3.9 的jar,项目升级了,现在得用5.x的了,所以就用5.x的给大家简单的演 ...

  5. Centos 7 部署Kubernetes集群 (基于cri-dockerd)

    前言 基础描述 从 k8s 1.24开始,dockershim已经从kubelet中移除,但因为历史问题docker却不支持kubernetes主推的CRI(容器运行时接口)标准,所以docker不能 ...

  6. SI24R2H_2.4GHz超低功耗无线发射与125KHZ接收一体芯片

    Si24R2H是一颗工作在2.4GHz ISM频段发射和125KHZ接收,专为超低功耗无线应用场景设计,集成嵌入式基带的无线收发单芯片.发射工作频率范围为2400MHz-2525MHz,共有125个1 ...

  7. reduced form(简化式)和structural form(结构式)

    在复习软件构造的时候,我发现了这样一道练习题 例题要求我们对照给出的RI和AF画出相应的映射图.在这里产生了一个疑问,什么是reduced form?是分子小于分母的意思吗? 但是根据给出的答案,并不 ...

  8. [iOS]获取地理位置信息

    1.在工程的 info.plist 文件中增加两个key( 右键 - Add Row ) Privacy - Location Always and When In Use Usage Descrip ...

  9. 容器逃逸 --with docker.sock

    容器逃逸 --with docker.sock 本人对于容器逃逸的基本理解就是用户从容器中逃出去到宿主机里去了. 本文意在记录一个使用 docker.sock 来进行容器逃逸的方法. 首先随便来个镜像 ...

  10. uniapp支付返回form

    在项目中,支付功能是一个常见的功能,调用支付宝时,后段给我们的是一个form的富文本内容 这时需要把form到页面渲染,方法如下: uni.request({ //仅为示例,并非真实接口地址. url ...