[toc]

一、多文件结构

1、一个工程可以划分为多个源文件

  • 类声明文件(.h文件)
  • 类实现文件(.cpp文件)
  • 类的使用文件(main函数所在的.cpp文件)

2、利用工程来组合各个文件

//Point.h ,类的定义
#ifndef POINT_H
#define 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;
//不能在类体中声明时初始化类的数据成员
//建议在类的构造函数中初始化数据成员
//只有整型或enum类型的 static const 数据成员可以在类体中初始化
};

#endif
//用预处理指令#ifndef、#define、#endif形成一个预处理器包装,可以防止将头文件多次包含在一个程序中
//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;
}
//5_10.cpp,主函数
#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;
}

1)外部变量
如果一个变量除了在定义它的源文件中可以使用外,还能被其它文件使用,那么就称这个变量是外部变量
文件作用域中定义的变量,默认情况下都是外部变量,但在其它文件中如果需要使用这一变量,需要用 extern 关键字加以声明
2)外部函数
所有类外声明的函数(也就是非成员函数),都具有文件作用域
可以在不同的编译单元中被调用,只要在调用声明函数原型即可。也可以在声明函数原型或定义函数时用 extern 修饰,其效果与不加修饰的默认状态是一样的
3)将变量和函数限制在编译单元内
使用匿名的命名空间:在匿名命名空间中定义的变量和函数,都不会暴露给其它的编译单元
被 " namespace { …… } " 括起的区域属于匿名的命名空间

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

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

  • 输入/输出类
  • 容器类与抽象数据类型
  • 存储管理类
  • 算法
  • 错误处理
  • 运行环境支持

二、编译预处理

习惯上,预处理指令中的符号常量通常是大写的头文件名,并用下划线替代句点
1、#include 包含指令
将一个源文件嵌入到当前源文件中该点处
#include<文件名>
–  按标准方式搜索,文件位于 C++ 系统目录的 include 子目录下
#include"文件名"
–  首先在当前目录中搜索,若没有,再按标准方式搜索

2、#define 宏定义指令
定义符号常量,很多情况下已被 const 定义语句取代
定义带参数宏,已被内联函数取代
#undef:删除由 #define 定义的宏,使之不再起作用

3、条件编译指令
1)#if 和 #endif

#if(常量表达式)
	程序正文    //当"常量表达式"非零时编译
#endif

2)#else

#if(常量表达式)
	程序正文1    //当"常量表达式"非零时编译
#else
	程序正文2    //当"常量表达式"为零时编译
#endif

3)#elif

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

4)#ifdef & #ifndef

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

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

C++——多文件结构和编译预处理命令的更多相关文章

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

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

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

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

  3. 编译预处理命令define

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

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

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

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

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

  6. C语言include预处理命令与多文件编译

    #include预处理命令几乎使我们在第一次接触C的时候就会碰到的预处理命令,可我现在还不怎么清楚,这次争取一次搞懂. 一.#include预处理指令的基本使用 预处理指令可以将别处的源代码内容插入到 ...

  7. 预处理命令[#define]说明

    宏定义 宏定义是对一些常见的变量.字符串等进行定义,被定义的数据在编译会进行自动替换.有时一些变量或字符串被多次使用,当需要修改时,就需要对源文件中它们出现的地方一一修改,效率比较低,而通过宏定义,只 ...

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

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

  9. 重编译Linux命令源代码

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

随机推荐

  1. 浅谈JavaWeb发展

    真的认认真真了解JavaWeb的发展,还是因为突然帮朋友弄个没什么功能的小网站时的突然奇想.但是上来就搭SSM的框架,搭到一半却想起来没什么功能那么麻烦干嘛.干脆不用框架,可是又蒙了,不用框架怎么写. ...

  2. 问题.beego路由设置及请求参数传递

    最近项目组安排将一组Lua实现的web服务端代码重构成Go实现,所以顺便学习了下Lua和Go,这里记录下在尝试重构的过程中遇到的几个问题. 1.beego路由设置 路由设置简单说下,主要是调用了pac ...

  3. lightoj 1060 - nth Permutation(组合数+贪心)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1060 题解:如果是不重复数的这些操作可以用康托展开的逆来求,如果是有重复数字出 ...

  4. JOBDU 1199 找位置

    题目1199:找位置 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2645 解决:1286 题目描述: 对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12 ...

  5. CF991C Candies 二分 第十五

    Candies time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  6. JAVA - 一个for循环实现99乘法表

    public class Test03 {public static void main(String[] args) { int lie = 1; for (int hang = 1; hang&l ...

  7. PHP 实现字符串表达式计算

    什么是字符串表达式?即,将我们常见的表达式文本写到了字符串中,如:"$age >= 20",$age 的值是动态的整型变量. 什么是字符串表达式计算?即,我们需要一段程序来执 ...

  8. Https与Http的区别以及Https的解说

    http:信息不加密,具有信息被盗的危险 https:信息加密,第三获取原信息 1:https多了一层SSL,而这一层的设计是为了达到如下的 (1) 所有信息都是加密传播,第三方无法窃听. (2) 具 ...

  9. 最大公共子序列(Runtime faster than 92.73% of Python3)

    其中的算法思想只是较为简单的动态规划,过去各种各样的考试写过很多次C/C++版本的,最近开始用Python做leetcode中的题目时遇到了该题目,很常规的做法竟然得到了意想不到的速度,但内存占用较差 ...

  10. Elastic Stack 笔记(三)Kibana5.6 安装

    博客地址:http://www.moonxy.com 一.前言 Kibana 是 Elastic Stack 公司推出的一个针对 Elasticsearch 的开源分析及可视化平台,可以搜索.查看存放 ...