【C++复习】5.7 多文件结构与编译预处理命令
1、C++项目结构
C++程序的一般组织架构
- 类声明文件(.h文件)
- 类实现文件(.cpp文件)
- 类的使用文件(main()所在的.cpp文件)
用工程组合各文件
2、编译链接
编译链接过程
3、外部变量/外部函数/命名空间
外部变量
- 除了在定义它的源文件中可以使用外,还能被其他文件使用
- 文件作用域中定义的变量,默认情况下都是外部变量
- 在其他文件中如果需要使用,需要用extern关键字声明
外部函数
- 在所有类外声明的函数(非成员函数),都是具有文件作用域的
- 这样的函数可以在不同的编译单元中被调用
- 只要在调用之前进行引用性声明(声明函数原型)即可。
将变量和函数限制在编译单元内
- 在匿名命名空间中定义的变量和函数,都不会暴露给其他编译单元
namespace{//匿名的命名空间
int n;
void f(){
n++;
}
}
4、标准C++库
5、编译预处理
#include
包含指令- 将一个源文件嵌入到当前源文件中该点处
- #include<文件名>
- 按标准方式搜索,文件位于C++系系统目录的include子目录下
- #include"文件名"
- 首先在当前目录中搜索,若没有,再按标准方式搜索
#define
宏定义指令- 定义符号常量,很多情况下已被const定义语句取代
- 定义带参数宏,已被内联函数取代
#undef
- 删除由#define定义的宏,使之不再起作用
#if
和#endif
(条件编译指令)- 一般用在.h文件中,防止头文件被重复包含,防止变量被重复定义。或者根据常量表达式进行“部分编译”“执行部分程序”
#if 常量表达式
//当“常量表达式”非零时候编译
这里是程序正文
#endif#if 常量表达式
//当“常量表达式”非零时候编译
这里是程序正文1
#else
//当“常量表达式”为零时候编译
这里是程序正文2
#endif#ifdef 标识符
程序段1
#else
程序段2
#endif
/*
如果“标识符”经#define定义过,且未经#undef删除,
则编译程序段1,否则编译程序段2
*/#ifndef 标识符
程序段1
#else
程序段2
#endif
/*
如果“标识符”未被定义过,
则编译程序段1,否则编译程序段2
//一般用在.h文件中,防止头文件被重复包含
*/
参考:C++语言程序设计(第5版),郑莉,清华大学
【C++复习】5.7 多文件结构与编译预处理命令的更多相关文章
- C++——多文件结构和编译预处理命令
[toc] 一.多文件结构 1.一个工程可以划分为多个源文件 类声明文件(.h文件) 类实现文件(.cpp文件) 类的使用文件(main函数所在的.cpp文件) 2.利用工程来组合各个文件 //Poi ...
- 编译预处理命令--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++语言完全兼容的 ...
- Verilog学习笔记基本语法篇(十二)········ 编译预处理
h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...
- 重编译Linux命令源代码
转: http://blog.csdn.net/endoresu/article/details/6967435 以su命令为例. 查看su命令的路径: # which su /bin/su 查看su ...
- 编译u-boot命令和u-boot常用命令
一.编译u-boot命令 1.配置开发板 #make TQ2440_config 2.编译 #make all 3.交叉编译器是crosstools_3.4.5_softfloat” 使用4.3.3版 ...
- 编译预处理 -- 带参数的宏定义--【sky原创】
原文:编译预处理 -- 带参数的宏定义--[sky原创] 如有转载请注明出处 编译预处理 -- 带参数的宏定义 前面为输出文件,后面为输入文件 gcc -E -o test.i test.c ...
随机推荐
- JS中面向对象的多种继承方式
JS本身是基于面向对象开发的编程语言,面向对象开发中最重要的一个概念就是类. 类具有三大特性:封装.继承.多态 封装:类也是个函数,函数的目的是把一个功能代码进行封装,以此实现"低耦合高内聚 ...
- vue移动端禁止弹层穿透、点击元素滚动到视图中心杂文日志
一,需求是在无限列card加载页面,点击任何一个card的显示图表按钮,图表自适应居中显示,显示遮罩层,页面可以滑动,但不能穿透点击 一个无限列表加载页面设置遮罩层一般需求是页面不能滑动的,但这比较特 ...
- Wifi Display
wifi display常用术语 AP:wifi access point Primary Sink: a device that supports rendering video content o ...
- ASP.NET Core http请求内容过大, IIS服务器 返回 Request Too Long 解决方案
1.修改web.config文件内容如下: <?xml version="1.0" encoding="utf-8"?> <configura ...
- k8s安装gitlab-ce
docker镜像打包 根据官方说明:gitlaby docker镜像中已经不包含邮件代理传输,需要重新打包镜像 FROM gitlab/gitlab-ce RUN apt-get update &am ...
- (jmeter笔记) websocket接口测试
1.在进程选择WebSocket Sampler 2.Websocket Sampler 界面 webserver Server Name or IP:输入连接的websocket服务器ip Port ...
- docker部署rocketmq
docker pull foxiswho/rocketmq:server-4.7.0 (拉取镜像) docker pull foxiswho/rocketmq:broker-4.7.0 (拉取镜像) ...
- centos 换源
原文: https://blog.csdn.net/MateSnake/article/details/124088310 备份原来的源:sudo mv /etc/yum.repos.d/CentOS ...
- SpringBoot + Shiro + Redis + JWT 实现无状态登录
这是一篇随笔和心得,不会写入任何的一种代码.只是提供一种逻辑. 在我之后,我会发现这种逻辑尤为重要 最近在做一套通用的权限管理项目,考虑使用的是Shiro 的这个框架.认证和鉴权就是权限框架所解决的问 ...
- Linux 第九章( 网卡配置,双网卡绑定,密钥,管理远程会话 )
/etc/hosts.allow 允许 //默认是先匹配允许在匹配拒绝 /etc/hosts.deny 拒绝 service iptables save //保存iptables配置 ...