《C++多文件编程是什么》一节提到,多文件编程中代码的划分原则是:将变量、函数或者类的声明部分存放在 .h 文件,对应的实现部分放在 .cpp 文件中。值得一提得是,此规律适用于大部分场景,但本节要讲的 const 常量是一个例外。

我们知道,用 const 修饰的变量必须在定义的同时进行初始化操作(除非用 extern 修饰,本节后续会讲解)。与此同时,C++ 中 const 关键字的功能有 2 个,除了表明其修饰的变量为常量外,还将所修饰变量的可见范围限制为当前文件。这意味着,除非 const 常量的定义和 main 主函数位于同一个 .cpp 文件,否则该 const 常量只能在其所在的 .cpp 文件中使用。

那么,如何定义 const 常量,才能在其他文件中使用呢?接下来给读者介绍 3 种在 C++ 多文件编程中定义 const 常量的方法。

1) 将const常量定义在.h头文件中

首先介绍一种最常用也最简单的方法,就是将 const 常量定义在 .h 文件中。

显然此方式违背了“声明位于 .h 文件,定义(实现)位于 .cpp 文件”的规律。在 C++ 多文件编程中,还有 2 种特殊情况是违背此规律的,分别是类的定义和内联函数的定义,通常情况下它们也都定义在 .h 文件中。

举个例子(实例一):

//demo.h

#ifndef _DEMO_H

#define _DEMO_H

const int num = 10;

#endif

//main.cpp

#include

#include"demo.h"

int main() {

std::cout << num << std::endl;

return 0;

}

项目执行结果为:

10

注意,将 const 常量定义在 .h 文件中,为了避免头文件被重复引入,推荐使用 #ifndef/#define/#endif 结构。除此之外,还有 2 中方式可以避免头文件被重复引入,读者可阅读《C++防止头文件被重复引入的3种方法》一文做详细了解。

可以看到,使用此方式定义的 const 常量,只需引入其头文件(比如这里的 demo.h),就可以使用它。

2) 借助extern先声明再定义const常量

当然,const 常量的定义也可以遵循“声明在 .h 文件,定义在 .cpp 文件”,借助 extern 关键字即可。例如(实例二):

//demo.h

#ifndef _DEMO_H

#define _DEMO_H

extern const int num; //声明 const 常量

#endif

//demo.cpp

#include "demo.h" //一定要引入该头文件

const int num =10; //定义 .h 文件中声明的 num 常量

//main.cpp

#include

#include "demo.h"

int main() {

std::cout << num << std::endl;

return 0;

}

项目执行结果为:

10

前面讲过,C++ const 关键字会限定变量的可见范围为当前文件,即无法在其它文件中使用该常量。而 extern 关键字会 const 限定可见范围的功能,它可以使 const 常量的可见范围恢复至整个项目。

3) 借助extern直接定义const常量

值得一提的是,第 2 种使用 extern 定义 const 常量的方式,还可以做进一步优化。

以实例二为例,demo.cpp 和 main.cpp 中都引入了 demo.h,而 demo.h 文件中只包含对 const num 常量的声明。要知道 C++ 编译器在运行项目时,会在预处理阶段直接将 #include 引入的头文件替换成该头文件中的内容(就可以理解为傻瓜式的复制粘贴)。

因此,我们可以将实例二中的项目做如下修改:

//demo.cpp

extern const int num =10;

//main.cpp

#include

extern const int num;

int main() {

std::cout << num << std::endl;

return 0;

}

项目执行结果为:

10

显然相比实例二,此项目中省略了 demo.h 头文件的创建,一定程序上提高了项目的编译效率。

本节介绍了 3 种在多文件编程中使用 const 常量的方法,相比后 2 种借助 extern 修饰 const 常量的方式,第一种方式更简单、更常用,推荐读者使用。

c语言const常量用法,C++ const常量在多文件编程中的3种用法相关推荐

  1. C语言学习笔记-----scanf【通过键盘将数据输入到变量中】(两种用法)

    C语言学习笔记-----scanf[通过键盘将数据输入到变量中](两种用法) 用法一:scanf("输入控制符",输入参数): 功能: 将从键盘输入的字符转化为输入控制符所规定格式 ...

  2. 掌握shell编程中数组的常见用法及示例

    From: http://www.embeddedlinux.org.cn/html/jishuzixun/201211/19-2386.html 给大家分享下数组的用法小例子,希望能给大家一点帮助. ...

  3. 轻松掌握shell编程中数组的常见用法及示例

    缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习 ...

  4. python预处理c语言_详解C语言编程中预处理器的用法

    预处理最大的标志便是大写,虽然这不是标准,但请你在使用的时候大写,为了自己,也为了后人. 预处理器在一般看来,用得最多的还是宏,这里总结一下预处理器的用法. #include #define MACR ...

  5. java编程里的values怎么使用,详解Java编程中super关键字的用法

    这篇文章主要介绍了Java编程中this与super关键字的用法,包括从内存结构方面分析super的作用域,需要的朋友可以参考下 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程 ...

  6. php use as是什么意思,use关键字在PHP中的几种用法

    在学习了和使用了这么多年的PHP之后,您知道use这个关键字在PHP中都有哪些用法吗?今天我们就来看一下它的三种常见用法. 1. 用于命名空间的别名引用 // 命名空间 include 'namesp ...

  7. java中arraycopy的用法_[jdk源码阅读系列]Java中System.arraycopy()的用法

    本文转载,原文链接: 3分钟了解Java中System.arraycopy的用法 - 伊万夫斯基 - 博客园  https://www.cnblogs.com/benjieqiang/p/114288 ...

  8. @Aspect中@Pointcut 12种用法

    本文主要内容:掌握@Pointcut的12种用法. Aop相关阅读 阅读本文之前,需要先掌握下面3篇文章内容,不然会比较吃力. Spring系列第15篇:代理详解(java动态代理&CGLIB ...

  9. Spring系列之@Aspect中@Pointcut 12种用法

    先了解几个概念 文中会涉及几个概念,先了解一下. target 用来表示目标对象,即需要通过aop来增强的对象. proxy 代理对象,target通过aop增强之后生成的代理对象. AspectJ ...

最新文章

  1. 分布式事务开局第一篇,从数据库事务隔离级别说起
  2. Boost--Graph
  3. Spring Boot2.0之整合Redis
  4. Openstack组件部署 — Keystone Install Create service entity and API endpoints
  5. cpp_extension dist must be a Distribution instance
  6. 写在11期培训班第五次课后作业前面的话
  7. 班级日常 | 一天一瞬间!
  8. 如何把握好 transition 和 animation 的时序,创作描边按钮特效
  9. intp适合学计算机吗,⑨MBTI测试,分析INTP型人格的专业选择和职业选择
  10. 谷歌补丁Android官网,谷歌已发布 19年12月 Android 安全补丁
  11. linux 查看磁盘分区,文件系统,使用情况的命令和相关工具介绍,新型linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍.doc...
  12. Java生鲜电商平台-提现模块的设计与架构
  13. lintcode 订单
  14. 企业oa系统是什么,有什么好用的办公软件推荐?
  15. 消费者生产者问题,哲学家问题
  16. 雅思备考-口语词组积累-第一章
  17. linux获取pc指针地址,为什么pc可以看成使程序存储器的地址指针
  18. 考研数据结构之队列(3.3)——练习题之设以数组Q.elems[maxSize]存储循环队列的元素,同时以Q.rear和Q.length分别指示循环队列中的队尾位置和队列中所含元素的个数(C表示)
  19. kali启动后出现Resuming from hibernation错误
  20. 联想拯救者刃7000K 2022 评测

热门文章

  1. Nginx---- Nginx命令配置到系统环境
  2. 计算机基础知识 笔试,计算机基础知识笔试题
  3. html里面css什么意思,Web前端
  4. 怎么计算z=x+y的概率密度_上大《Scripta Mater》基于第一性原理计算,研究镁合金强化相!...
  5. cad2008加载 et拓展工具_译文:8个值得推荐的用于前端开发的性能分析工具「渡一教育」...
  6. elementui 单独修改一个label的样式
  7. SpringBootSwagger构建REST API并生成API文档
  8. linux下kafka安装与配置
  9. 系统吞吐量、TPS(也叫QPS)、用户并发量、性能测试概念和公式
  10. html的article标签,介绍一个html5做的网站,以及article标签的用法