锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / C++开源社区 / C++17 inline变量优点和示例

服务方向

人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
量化预测
股票离线分析软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发

联系方式

固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品原创,禁止转载和任何形式的非法内容使用,违者必究。点名“简易百科”和“闲暇巴”盗用锐英源原创内容。


C++17 inline变量优点和示例


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;

友情链接
版权所有 Copyright(c)2004-2024 锐英源软件
统一社会信用代码:91410105098562502G 豫ICP备08007559号 最佳分辨率 1440*900
地址:郑州市金水区文化路97号郑州大学北区院内南门附近