精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
服务方向
联系方式
锐英源精品原创,禁止转载和任何形式的非法内容使用,违者必究。点名“简易百科”和“闲暇巴”盗用锐英源原创内容。
C++17 inline变量简化了头文件和cpp文件的耦合,现代语言基本上对代码文件不区分,C++分头文件和cpp文件就带来复杂度和学习难度,这次C++17 inline变量支持C++头文件全实现一个类,降低了这种耦合,不过还没有彻底解决。头文件一般理解为类的声明,cpp文件是类的实现,有只想知道声明的地方包含头文件,这本来是C++想做好事的地方,但是对初学者确实不友好。
不过inline变量和inline函数的目的不一样,不要混淆,inline函数不是真函数,能优化性能,而inline变量只是让变量的事一行完成。
C++17 标准赋予了我们声明内联变量的能力。
此功能使实现仅头文件库变得更加容易(其中,组成库的所有宏、函数和类的完整定义都以头文件形式对编译器可见)。
请注意,C++11 向我们介绍了非静态数据成员,通过它,我们可以在一个地方声明和初始化成员变量:
class MyDate {
int m_year { 2019 };
int m_month { 11 };
int m_day { 10 };
std::string strSeason{ "Winter" };
};
但是,在 C++17 之前,我们无法直接在类中初始化静态变量 data member 的值。我们必须在类之外执行初始化。
让我们看一个 '' 类的简单示例,它可以是典型的仅 Headers 库的一部分。Environment
#include <iostream>
class Environment {
public:
static const std::string strVersionOS { "Windows" };
};
Environment environementManager;
在类定义下面,我们定义了一个全局类对象来访问类Environment的静态数据成员。
如果我们尝试编译上述文件,则会收到以下错误:
这里发生了什么,为什么编译器会抱怨?
该Environment类包含一个static成员,同时,它本身是全局可访问的,这导致当从多个翻译单元中包含时,会产生双重定义的符号。当我们打开多个 C++ 源文件以编译和链接它们时,它没有成功。
要修复这个错误,我们需要添加 inline 关键字,这在 C++17 之前是不可能的:
#include <iostream>
class Environment {
public:
static const inline std::string strVersionOS { "Widows" };
};
inline Environment environementManager;
以前,只有方法/函数可以声明为内联变量,但 C++17 也允许我们声明内联变量。
在上面的示例中,我们在一个地方做了一个声明和定义,但这可以在不同的地方完成,例如,像这样:
C++
#include <iostream>
class Environment {
public:
static const std::string strVersionOS;
};
inline const std::string Environment::strVersionOS = "Windows";
inline Environment environementManager;