C++——多文件结构和编译预处理命令
[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++——多文件结构和编译预处理命令的更多相关文章
- 编译预处理命令--define和ifdef的使用
这里将对常用的预处理命令进行学习. 一.宏定义 ·defined 格式:`defined 宏名 数值 或者 `define 宏名 注意:后面没有‘;‘,和单片机不一样: ...
- C/C++编译预处理命令详解【转】
1. 预处理程序 按照ANSI标准的定义,预处理程序应该处理以下指令: #if #ifdef #ifndef #else #elif #endif #define #undef #lin ...
- 编译预处理命令define
#include 包含指令 将一个源文件嵌入到当前源文件中该点处. #include<文件名> 按标准方式搜索,文件位于C++系统目录的include子目录下 #include" ...
- c语言编译预处理和条件编译执行过程的理解
在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令.预处理命令属于C语言编译器,而不是C语言的组成部分.通过预处理命令可扩展C语言程序设计的环境. 一.预处理的工作方式 1.1. ...
- C预编译, 预处理, C/C++头文件, 编译控制,
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...
- C语言include预处理命令与多文件编译
#include预处理命令几乎使我们在第一次接触C的时候就会碰到的预处理命令,可我现在还不怎么清楚,这次争取一次搞懂. 一.#include预处理指令的基本使用 预处理指令可以将别处的源代码内容插入到 ...
- 预处理命令[#define]说明
宏定义 宏定义是对一些常见的变量.字符串等进行定义,被定义的数据在编译会进行自动替换.有时一些变量或字符串被多次使用,当需要修改时,就需要对源文件中它们出现的地方一一修改,效率比较低,而通过宏定义,只 ...
- Verilog学习笔记基本语法篇(十二)········ 编译预处理
h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...
- 重编译Linux命令源代码
转: http://blog.csdn.net/endoresu/article/details/6967435 以su命令为例. 查看su命令的路径: # which su /bin/su 查看su ...
随机推荐
- P2059 [JLOI2013]卡牌游戏 概率DP
link:https://www.luogu.org/problemnew/show/P2059 题意: 有n个人,类似约瑟夫环的形式踢人,但是报的数是不同的,是在给定的许多数中随机抽取,问最后第i个 ...
- codeforces 879 D. Teams Formation(思维)
题目链接:http://codeforces.com/contest/879/problem/D 题意:这题题意我反正是看了很久,可能是我的理解能力有点差,就是将一个数组倍增m倍然后将连续的相同的k个 ...
- 染色 Wannafly挑战赛20 A 思维
链接:https://www.nowcoder.com/acm/contest/133/A来源:牛客网 现在有一棵被Samsara-Karma染了k种颜色的树,每种颜色有着不同的价值 Applese觉 ...
- 【Offer】[18-2] 【删除链表中重复的节点】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3- ...
- IDEA中创建maven web项目
本文将带你一路从IDEA中maven的配置到创建maven web项目,掌握IDEA中maven的使用. 一.IDEA中配置maven 开发中一般我们使用自己下载的maven,不使用IDEA工具自带的 ...
- IDEA中的各种快捷键
1.get.set快捷键: Alt+Insert 2.idea补全返回值快捷键 比如写了一个new User(),需要补全前面的User user ctrl+alt+V 3.idea全局搜索: Ctr ...
- Redis 的底层数据结构(SDS和链表)
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.可能几乎所有的线上项目都会使用到 Redis,无论你是做缓存.或是用作消息中间件,用起来很简单方便 ...
- android 百度地图入门01 (史上最详没有之一)
最近一直和百度地图打交道,写几篇博客记录一下吧,目前最新版是4.0的 ,之前我用的是3.7的, 就以4.0的为例说一下最基本的配置流程吧. 一.准备工作 1.申请一个百度地图开发者账户--地址:htt ...
- java中的equals方法与"=="运算符解说
在编程的时候,我们可能经常会用到equals方法,那么这个equals方法和运算符“==”有什么样的区别? public class equal { /** * @param args */ publ ...
- hive 包含操作(left semi join)(left outer join = in)迪卡尔积
目前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现. 假设有一个登陆表login(当天登陆记录,只有一个uid),和一个用户注册表regusers(当天注 ...