C++ const常量在多文件编程中的3种用法
《C++多文件编程是什么》一节提到,多文件编程中代码的划分原则是:将变量、函数或者类的声明部分存放在 .h 文件,对应的实现部分放在 .cpp 文件中。值得一提得是,此规律适用于大部分场景,但本节要讲的 const 常量是一个例外。
我们知道,用 const 修饰的变量必须在定义的同时进行初始化操作(除非用 extern 修饰,本节后续会讲解)。与此同时,C++ 中 const 关键字的功能有 2 个,除了表明其修饰的变量为常量外,还将所修饰变量的可见范围限制为当前文件。这意味着,除非 const 常量的定义和 main 主函数位于同一个 .cpp 文件,否则该 const 常量只能在其所在的 .cpp 文件中使用。
那么,如何定义 const 常量,才能在其他文件中使用呢?接下来给读者介绍 3 种在 C++ 多文件编程中定义 const 常量的方法。
以实例二为例,demo.cpp 和 main.cpp 中都引入了 demo.h,而 demo.h 文件中只包含对 const num 常量的声明。要知道 C++ 编译器在运行项目时,会在预处理阶段直接将 #include 引入的头文件替换成该头文件中的内容(就可以理解为傻瓜式的复制粘贴)。
因此,我们可以将实例二中的项目做如下修改:
我们知道,用 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 <iostream> #include"demo.h" int main() { std::cout << num << std::endl; return 0; }项目执行结果为:
10
可以看到,使用此方式定义的 const 常量,只需引入其头文件(比如这里的 demo.h),就可以使用它。注意,将 const 常量定义在 .h 文件中,为了避免头文件被重复引入,推荐使用 #ifndef/#define/#endif 结构。除此之外,还有 2 中方式可以避免头文件被重复引入,读者可阅读《C++防止头文件被重复引入的3种方法》一文做详细了解。
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 <iostream> #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 <iostream> extern const int num; int main() { std::cout << num << std::endl; return 0; }项目执行结果为:
10
显然相比实例二,此项目中省略了 demo.h 头文件的创建,一定程序上提高了项目的编译效率。本节介绍了 3 种在多文件编程中使用 const 常量的方法,相比后 2 种借助 extern 修饰 const 常量的方式,第一种方式更简单、更常用,推荐读者使用。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算