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

1、c++程序的一般组织结构

通常一个项目至少划分为三个文件:类定义文件(*.h文件)、类实现文件(*.cpp文件)和类的使用文件(*.cpp,主函数文件)。如下:

这三个单独的源文件构成,他们的相互关系和编译、连接过程,如下

2、外部变量和外部函数

a、为了使变量除了在定义它的文件中使用外,还要被其他文件使用,可以将其声明为外部变量,用extern关键字。

外部变量时具有文件作用域的变量,定义在所有文件之外。声明一个外部变量时,可以同时定义它,也可以只是引用一个在别处声明的外部变量。

定义一个文件作用域的变量时,其默认状态是可以为不同的编译单元(即源文件)所共享的,只要在其他编译单元在中冠以extern声明该变量即可。

b、外部函数

在所有类之外声明的函数(非成员函数),都是具有文件作用域的,如果没有特殊说明,这样的函数都可以在不同的编译单元中被调用,只要在调用之前函数原型即可。

3、标准c++库和命名空间

在c语言中系统函数和一些宏定义都放置在运行库中,c++的库中除了继续保留了c语言系统函数外,还加入了预定义的模板和类。标准c++类库是一个极为灵活并可扩展的可重用软件模板的集合。标准c++类与组件在逻辑上分为6中类型:

输入/输出类

容器类与ADT(抽象数据类型)

存储管理类

算法

错误处理

运行环境支持

对于库中预定义内容的说明分别存在于不同的头文件中,要使用这些预定义的成分,就要将相应的头文件包含到圆程序中。不同的编译系统,库和头文件都会略有不同。

4、编译预处理

编译器在对源程序进行编译之前,首先要由预处理程序对程序文本进行预处理。预处理程序提供了一组编译预处理指令和预处理操作符。

a、#include指令

也称为文件包含指令,其作用是将另一个源文件嵌入到当前源文件中该点处。有两种格式:#include<文件名>和#include"文件名"

b、#define 和#undef指令

在c语言中,还可以使用#define来定义带参数宏,以简单实现函数的计算,而在c++中这一功能已被内联函数取代。

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

c、条件编译

形式1

#if 常量表达式  //当常量表达式为非零时,编译本程序段

程序段

#endif

形式2

#if 常量表达式

  程序段1

#else

  程序段2

#endif

形式3

#if 常量表达式1

程序段1

#elif 常量表达式2

程序段2

....

#elif 常量表达式n

  程序段n

#else

程序段n+1

#endif

形式4

#ifdef   标识符

程序段1

#else

    程序段2

#endif

如果标识符经#define定义过,且未经undef删除,则编译程序段1,否则,编译程序段2

形式5

#ifndef   标识符

程序段1

#else

    程序段2

#endif

与形式4相反

4、defined操作符

它是一个预处理操作符,而不是指令,因此不要加#开头,defined操作符使用的形式为:defined(标识符)

若标识符在此前经#define定义过,未经删除,则上述表达式为非0.否则上述表达式的值为0.

由于文件包含指令可以嵌套使用,在设计程序是要避免多次重复包含同一个头文件,否则会引起变量及类的重复定义。

一般会在头文件中加上

//head.h

#ifndef HEAD_H

#define HEAD_H

.......

首先判断HEAD_H是否定义过,没有则是第一次编译,如果定义过就说明已经参加过编译了。

3-C++程序的结构1.5的更多相关文章

  1. ELF Format 笔记(十一)—— 程序头结构

    ilocker:关注 Android 安全(新手) QQ: 2597294287 程序头表 (program header table) 是一个结构体数组,数组中的每个结构体元素是一个程序头 (pro ...

  2. 黑马程序员——JAVA基础之程序控制流结构之判断结构,选择结构

    ------- android培训.java培训.期待与您交流! ---------- 程序控制流结构:顺序结构:判断结构:选择结构:循环结构. 判断结构:条件表达式无论写成什么样子,只看最终的结构是 ...

  3. Delphi XE5教程5:程序的结构和语法

    内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...

  4. 【Xamarin挖墙脚系列:Xamarin.IOS的程序的结构】

    原文:[Xamarin挖墙脚系列:Xamarin.IOS的程序的结构] 开始熟悉Xamarin在开发IOS的结构!!!!!!! 先看官方 这个是以一个单页面的程序进行讲述的. 1 程序引用的程序集,核 ...

  5. 【Xamarin挖墙脚系列:典型的业务程序的结构搭建】

    原文:[Xamarin挖墙脚系列:典型的业务程序的结构搭建] 其实app就是客户端.在现代的程序中,都是典型的C/S结构.当然,一些离线的小游戏,功能性应用除外,如:电话本,通信录,短信查看等等 这个 ...

  6. 微信小程序开发01 --- 微信小程序项目结构介绍

    一.微信小程序简单介绍: 微信官方介绍微信小程序是一个不需要下载安装就可使用(呵呵,JS代码不用下载吗?展示的UI不用下载吗?)的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用. ...

  7. 毕业设计预习:VHDL入门知识学习(一) VHDL程序基本结构

    VHDL入门知识学习(一) VHDL程序基本结构 简介 VHDL程序基本结构 简介 概念: HDL-Hardware Description Language-硬件描述语言-描述硬件电路的功能.信号连 ...

  8. Java程序的结构和执行

    目录 Java程序的结构 Java程序的执行 source code -- compiler -- class file -- JVM compiler JVM Java语法 数据类型 数据的存储 堆 ...

  9. Android应用程序项目结构

    Android应用程序项目结构 [src]:JAVA源代码目录 [gen]:由系统自动生成的JAVA源码文件,不可修改,只可查看和使用 加载的和依赖的类库 [assets]:本地存储文件的一个文件夹 ...

  10. C语言基础知识-程序流程结构

    C语言基础知识-程序流程结构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.概述 C语言支持最基本的三种程序运行结构:顺序结构,选择结构,循环结构. 顺序结构:程序按顺序执行, ...

随机推荐

  1. [URAL-1517][求两个字符串的最长公共子串]

    Freedom of Choice URAL - 1517 Background Before Albanian people could bear with the freedom of speec ...

  2. 【BZOJ2626】JZPFAR kd-tree+堆

    [BZOJ2626]JZPFAR Description 平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号.如果有两个( ...

  3. vue element-ui 自动获取光标

    <el-input ref="customerInput"></el-input> this.$refs.mark.$el.querySelector('i ...

  4. toitorsegit and toitorstsvn文件夹icon冲突不显示

    Go to HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer Add a new string value & ...

  5. 我的Android进阶之旅------>对Java中注释/**@hide*/的初步认识

    今天写一个调节系统背光亮度的时候,参考了Android中的Setting源码,在源码中有这么一段代码: private static final int MAXIMUM_BACKLIGHT = and ...

  6. (Android)react-native-splash-screen实践-解决react-native打包好后启动白屏的问题

    1.安装 npm i react-native-splash-screen --save or yarn add react-native-splash-screen --save 2.自动配置 re ...

  7. Shell 特殊位置参数的变量

    $0 -- 获取当前执行shell脚本的 文件名 $n -- 获取当前执行shell脚本的 第n个参数 $# -- 获取当前执行shell脚本的 带的参数个数 $? -- 获取执行上一个指令的执行状态 ...

  8. JMS消息可靠机制

    ActiveMQ消息签收机制: 客戶端成功接收一条消息的标志是一条消息被签收,成功应答. 消息的签收情形分两种: 1.带事务的session 如果session带有事务,并且事务成功提交,则消息被自动 ...

  9. Object.is() Pollyfill

    if (!Object.is) { Object.is = function(x, y) { // SameValue algorithm if (x === y) { // Steps 1-5, 7 ...

  10. the art of seo(chapter eight)

    How Social Media and User Data Play a Role in Search Results and Rankings ***Correlation Between Soc ...