当前位置: 首页 > 编程日记 > 正文

C++中#include的工作原理

大多数人可能对“#include”比较熟悉,因为我们写C/C++程序的时候都会写的字符串之一,但是它是具体怎么工作的?或者它的原理是什么呢?

可能不太熟悉,也有可能没有去关心过。我们只关心程序能否正确运行,或者程序怎么实现等等一些问题。 


这里笔者就为介绍下我们熟悉又不太熟悉的“#include”,首先我们了解下C/C++头文件。

头文件为相关声明提供了一个集中存在的位置。头文件一般包含类的定义,extern变量声明与函数声明。注意这里声明与定义的区别:它们最本质的区别是定义只可以出现一次,声明可以出现多次。声明不分配空间,而定义是要分配空间的。头文件正确使用可以保证所有文件使用给定实体的同一声明;当声明需要修改时,只有头文件需要更新。

头文件还可以定义:在编译的时候就已知道其值的cosnt对象和inline 函数。在头文件中定义上述实体,是因为编译器需要它们的定义来产生代码。例如:为了产生能定义或使用类的对象代码,编译器需要知道组成该类型的数据成员,也需要知道对应的函数。

在C++中,有些地方需要放置常量表达式。例如:枚举成员的初始化必须是常量表达式。常量表达式是编译器在编译时就能够在计算出结果的表达式。当const整型变量通过常量表达式自我初始化时,这个const整型变量就可能是常量表达式。而const变量要成为常量表达式,初始化必须为编译器可见。为了能够让多个文件使用相同的常量值,const变量和它的初始化必须是每个文件都可见的。所以将其定义放到头文件中,无论const常量何时使用,编译器都能知道其初始化。

#include是怎么样工作的?

#include设施是C++预处理器的一部分。

预处理器处理程序的源代码,是在编译器之前运行。

#include只接受一个参数:头文件名。

预处理器用指定的头文件的内容替代每个include。

我们自己的头文件存储在文件中。系统的头文件可能用特定于编译器的更高效的格式保存。

头文件经常#include其他头文件。头文件定义的实体经常使用在其他文件的设施。所以设计的头文件时,应使其可以多次包含在同一源文件中。我们必须保证包含同一头文件不会引起该头文件定义的类和对象被多次定义。使得头文件安全的通过做法,使用预处理器定义头文件保护符。

什么是头文件保护符?

看看下面内容大家就会明白了

在编写头文件之前,我们需要引入一些额外的预处理器设施。预处理器允许我们自定义变量。为了避免名字冲突,预处理器变量经常用全大写字母表示。预处理变量有两种状态:已定义或未定义。

代码如下:

#ifndef BEGEIN_H

#define BEGEIN_H

//定义一些类或者定义函数
#endif



如果没有两个头文件定义和使用相同的预处理器变量,那么就没有问题。如果出现上述情况,可以用定义在头文件里实体类来命名预处理器变量来避免预处理变量重名问题。

#include <>与#include " "区别
如果头文件名在<>中,就会被认为是标准头文件。编译器会在预定义的位置查找该头文件,如果是""就认为它是非系统头文件,非系统文件查找通常开始于源文件所在路径。

转载于:https://www.cnblogs.com/wangduo/p/5553929.html

相关文章:

浅谈几种区块链网络攻击以及防御方案之其它网络攻击

旧博文&#xff0c;搬到 csdn 原文&#xff1a;http://rebootcat.com/2020/04/16/network_attack_of_blockchain_other_attack/ 写在前面的话 自比特币诞生到现在&#xff0c;比特币&#xff08;网络&#xff09;经历过大大小小非常多次的攻击&#xff0c;尤其在比特币诞生之初…

基于深度学习和传统算法的人体姿态估计,技术细节都讲清楚了

作者 | 站长 pursueYfuture来源 | AI专栏&#xff08;ID: pursue-Y-future&#xff09;计算机视觉的一大研究热点是人体姿态估计&#xff0c;还有很多问题急需解决&#xff0c;比如遮挡&#xff0c;交互等等。在最近的CVPR2020里边也有很多这方面的工作。本文站长主要是想谈谈基…

怎么让百度快速重新收录

每天更新网站和做外链让百度重新收录的快速方法很多人都比较头疼让百度如何重新来收录你站点&#xff0c;这里为大家介绍一下我的经验;大家都知道做网络推广&#xff0c;特别是企业站推广&#xff0c;如果能在相关的关键字在搜索引擎里有个好的名次&#xff0c;肯定能给企业增长…

HQL语句大全

Hibernate配备了一种非常强大的查询语言&#xff0c;这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑&#xff0c;HQL是非常有意识的被设计为完全面向对象的查询&#xff0c;它可以理解如继承、多态 和关联之类的概念。Hibernate配备了一种非常强大的查询语言&#…

自动创建阿里云抢占式实例

旧博文&#xff0c;搬到 csdn 原文&#xff1a;http://rebootcat.com/2020/08/24/auto_run_aliyun_spot/ aliyun_spot 自动创建阿里云抢占式实例。 支持一下作者&#xff0c;购买阿里云 背景 阿里云抢占式实例应该属于阿里云的一种闲置资源利用&#xff0c;性价比非常高&am…

What?! Python一行代码,能玩这么多童年的游戏?

来源 | 早起 Python责编 | Carol封图 | CSDN 下载自视觉中国儿童节就要来了&#xff0c;虽然秃头程序员没有头发&#xff0c;但是童心还是一直都在的&#xff0c;今天就分享一个私藏的GitHub项目——free-python-games&#xff0c;一行代码就能进入使用Python开发的小游戏快乐…

McAfee可能要收购NitroSecurity?

近日&#xff0c;根据国外媒体报道和业界人士的坊间传闻&#xff0c;有传闻指McAfee可能将在近期收购SIEM厂商NitroSecurity。最近&#xff0c;NitroSecurity正在准备IPO&#xff0c;去年年收入约4000万美元&#xff0c;在Gartner的MQ中位于Leader阵营。 NitroSecurity的SIEM技…

进程间通信IPC之--共享内存

每个进程各自有不同的用户地址空间&#xff0c;任何一个进 程的全局变量在另一个进程中都看不到&#xff0c;所以进程之间要交换数据必须通过内核&#xff0c;在内核中开辟一块缓冲 区&#xff0c;进程1把数据从用户空间拷到内核缓冲区&#xff0c;进程2再从内核缓冲区把数据读…

Scons构建C++项目

旧博文&#xff0c;搬到 csdn 原文&#xff1a;http://rebootcat.com/2020/08/30/scons/ 前言 我是一个 linux c 开发者&#xff0c;但是一直对 Makefile 的语法很是头痛&#xff0c;每次都记不住&#xff0c;所以每次写 Makefile 都很痛苦&#xff0c;Makefile 里需要你自己编…

2020 AI产业图谱启动,勾勒中国AI技术与行业生态

《2020年国务院政府工作报告》提出&#xff0c;重点支持「两新一重」建设。其中「两新一重」中的第一个「新」&#xff0c;就是新基建&#xff0c;而人工智能是新基建的重要组成部分。新基建首次被纳入政府工作报告后&#xff0c;各大科技厂商纷纷押注&#xff0c;重金投向「新…

Windows Phone 7 SDK 7.1 Beta2 发布

早上看到消息&#xff0c;有Marketplace账号的筒子们注意了&#xff0c;可以去下载芒果的ROM了&#xff0c;一个开发者账号只能更新一个WP7&#xff0c;以下是App hub上的消息&#xff1a;来自http://create.msdn.com/en-US/news/Mango_Beta。关于开发工具的更新&#xff0c;可…

javascript基础语法——表达式

前面的话 一般地&#xff0c;关于javascript基础语法&#xff0c;人们听得比较多的术语是操作符和语句。但是&#xff0c;其实还有一个术语经常使用&#xff0c;却很少被提到&#xff0c;这就是javascript表达式(expression)。本文将详细介绍javascript表达式&#xff0c;表达式…

Hexo Next 博客添加相册瀑布流

原文&#xff1a;https://rebootcat.com/2020/09/19/nextphotowall/ 前言 一直没有时间来整理下博客搭建的一些事情&#xff0c;现在补上一篇&#xff0c;给 Hexo Next 博客添加一个相册功能&#xff0c;使用瀑布流的方式。 原理说明 使用 github 作为仓库存储图片文件&…

【分享几个日常巡检 监控数据库的语句】

查看数据库表空间语句 select df.tablespace_name "表空间名",totalspace "总空间M",freespace "剩余空间M",round((1-freespace/totalspace)*100,2) "使用率%" from (select tablespace_name,round(sum(bytes)/1024/1024) totalspa…

AI换脸、声音篡改等,明确写入新版《民法典》

来源 | HyperAI超神经5 月 28 日&#xff0c;十三届全国人大三次会议表决通过了《中华人民共和国民法典》&#xff08;以下简称《民法典》&#xff09;第四编人格权中的第四章肖像权&#xff0c;明确提出了以信息技术手段&#xff0c;对于他人肖像、声音等权益的侵害认定。《民…

awk: (FILENAME=- FNR=1) 致命错误: 试图访问字段 -2

执行&#xff1a;awk {print $(NF-2)} aa.log出现错误&#xff1a;awk: (FILENAMEaa.log FNR1) 致命错误: 试图访问字段 -2可能和aa.log中数据有关系&#xff1a;改为&#xff1a;awk NF>1{print $(NF-2)} aa.log转载于:https://blog.51cto.com/henly/1786692

迁移博客到香港虚拟空间

原文&#xff1a; https://rebootcat.com/2020/09/20/virtual_space_blog/ 缘起 我的博客一直采用的是 github pages 来托管&#xff0c;中间断断续续的也没怎么管理过&#xff0c;偶尔写几篇博客&#xff0c;所以也就没怎么关心过访问速度&#xff0c;搜索引擎收录等问题。 …

自动化神经网络理论进展缓慢,AutoML算法的边界到底在哪?

作者 | 夕颜出品 | CSDN&#xff08;ID:CSDNnews&#xff09;「AI 技术生态论」 人物访谈栏目是 CSDN 发起的百万人学 AI 倡议下的重要组成部分。通过对 AI 生态顶级大咖、创业者、行业 KOL 的访谈&#xff0c;反映其对于行业的思考、未来趋势判断、技术实践&#xff0c;以及成…

让电脑通过gns3里的路由器上网

题目我感觉写的不好&#xff0c;反正就是这个意思&#xff0c;看下文 头几天有网友问cisco2811路由器怎么用ACL封掉QQ&#xff0c;当时就想帮他&#xff0c;但是手里又没有cisco路由器&#xff0c;只有GNS3 cisco模拟器。 现在的问题就是要用gns3模拟器的路由器充当真实工作中的…

文件上传的渐进式增强

文件上传是最古老的互联网操作之一。 20多年了&#xff0c;它几乎没变&#xff0c;还是原来的样子&#xff1a;操作麻烦、缺乏交互、用户体验不佳。在这个新技术日新月异的时代&#xff0c;显得非常落伍。 网页开发者们想了很多办法&#xff0c;试图提升文件上传的功能和操作体…

使用 mkdocs 搭建个人 wiki 站点

原文&#xff1a; https://rebootcat.com/2020/09/20/wiki/ why wiki 博客通常是用来记录一些完整的文章&#xff0c;每篇文章有一个主题。但是我想把平日里的一些笔记也记录到我的博客里&#xff0c;但笔记是零散的&#xff0c;随时的&#xff0c;不是完整的一个主题。所以打…

追忆童年,教你用Python画出儿时卡通人物

作者 | 张同学来源 | 凹凸数据大家好&#xff0c;我是张同学。又到一年一度的国际儿童节&#xff0c;作为逢节必过的程序猿&#xff0c;怎么可以放过这个学习技能的机会呢&#xff1f;于是&#xff0c;今天我们来学习 Python 的 Turtle 库绘制童年的卡通人物&#xff0c;一起做…

xx学OD -- 消息断点 RUN跟踪(上)

这一篇讲的是 消息断点和RUN跟踪的简单知识这一篇没怎么看明白 大概使用知道了 怎么用不太清楚。介绍本次软件特点输入后木有反应(纱布垃圾的。。哈哈)启动OllyDBG载入这个程序&#xff0c;F9让它运行。这个程序按我们前面讲的采用字串参考或函数参考的方法都很容易断下来。…

iOS-UIWebView添加头部和尾部

2019独角兽企业重金招聘Python工程师标准>>> 前言 项目中使用UIWebView显示本地或者是服务器上的页面很容易&#xff0c;但是仅限于显示页面&#xff0c;可控性并不高&#xff0c;如果有需要在头部和尾部加上原生的view&#xff0c;显示部分信息相对于全部使用UIWeb…

epoll 入门例子 tcp server/client

原文&#xff1a; https://rebootcat.com/2020/09/26/epoll_examples/ 复习一下 上一篇博文 epoll原理深入分析 详细分析了 epoll 底层的实现原理&#xff0c;如果对 epoll 原理有模糊的建议先看一下这篇文章。那么本文就开始用 epoll 实现一个简单的 tcp server/client。 本…

张红忠:智慧化时代,如何通吃5G模组、AIoT?

受访者 | 张红忠&#xff0c;日海智能副总裁、云AIoT创新中心总经理记者 | Aholiab&#xff0c;编辑 | 邓晓娟出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;日海智能是目前国内AIoT领域的头部企业&#xff0c;以AIoT为核心&#xff0c;形成了5G&AI物联网终端、…

JQUERY打造隐藏在左侧的弹性弹出菜单

代码简介&#xff1a; 隐藏在左侧的弹性弹出菜单&#xff0c;从淘宝扣下来的&#xff0c;也可作为JAvaScript缓冲动画的典型教程。本弹性菜单可扩展性强&#xff0c;实际上不光可以做成菜单&#xff0c;也可布局一些图文混排的内容或一段视频&#xff0c;总之被弹出的内容是在一…

Num55 boss09(activiti安装以及API)

2019独角兽企业重金招聘Python工程师标准>>> 安装流程设计器插件&#xff1a; 使用框架提供的方式创建23张表&#xff1a; 流程部署&#xff0c;定义&#xff0c;启动&查询&#xff0c;办理任务&#xff1a; 流程的部署&#xff0c;查询&#xff0c;删除 & …

模仿nginx修改进程名

个人博客原文&#xff1a; https://rebootcat.com/2020/10/25/setproctitle/ nginx 进程名 使用 nginx 的过程中&#xff0c;我们经常看到 nginx 的进程名是不同的&#xff0c;如下&#xff1a; $ ps -ef |grep nginx smaug 1183 1115 0 05:46 pts/2 00:00:00 grep …

机器学习模型的超参数优化 | 原力计划

作者 | deephub责编 | 王晓曼出品 | CSDN博客头图 | CSDN付费下载自东方IC引言模型优化是机器学习算法实现中最困难的挑战之一。机器学习和深度学习理论的所有分支都致力于模型的优化。机器学习中的超参数优化旨在寻找使得机器学习算法在验证数据集上表现性能最佳的超参数。超参…