[c++17新增语言特性] --- 内联变量 和 if

简介: [c++17新增语言特性] --- 内联变量 和 if

1 内联变量介绍

C++17中引入了内联变量(inline variables)的概念,它允许我们在头文件中定义全局变量,而不必担心重复定义的问题。

内联函数类似,内联变量也可以在多个编译单元中使用而不会出现链接错误,因为编译器会将它们视为多个实例的同一变量,而不是多个不同的变量。

2 内联变量应用场景示例

当我们在头文件中定义一个内联变量时,它可以在多个cpp文件中使用而不会导致重复定义的问题。下面是一个使用内联变量的例子:

// header file: myheader.h

#pragma once
inline int my_global_var = 42;

// source file: file1.cpp

#include "myheader.h"
#include <iostream>
void do_something() {
    std::cout << my_global_var << std::endl;
}

// source file: file2.cpp

#include "myheader.h"
int main() {
    my_global_var = 99;
    do_something();
    return 0;
}

在这个例子中,我们在头文件myheader.h中定义了一个内联变量my_global_var。在file1.cpp中,我们定义了一个函数do_something,它使用了my_global_var变量;在file2.cpp中,我们直接修改了my_global_var变量的值,并且调用了do_something函数。

需要注意的是,我们在两个cpp文件中都包含了myheader.h头文件。由于my_global_var是一个内联变量,因此它在两个cpp文件中都被视为同一个变量。因此,在file2.cpp中对my_global_var的修改会影响到do_something函数中的输出结果。

在实际使用中,我们可以在头文件中定义一些常量或全局状态等信息,然后在多个cpp文件中使用它们。使用内联变量可以避免重复定义的问题,并且可以提高程序的性能。但是,需要注意内联变量的定义和使用限制,以避免出现不可预期的错误。

3 c++17 if的拓展

C++17 引入的 if 初始化 (if initialization) 特性,允许在 if 语句中直接初始化变量。这个特性可以使代码更加简洁、易读、易维护。

if 初始化特性的语法如下:

if (init-statement; condition) {
    statement;
}

其中,init-statement 是一个初始化语句,condition 是一个条件表达式,statement 是一个语句块。

if 初始化特性的主要作用是在条件判断之前初始化一个变量。这个变量只在 if 语句中有效,不会影响到 if 语句块外部的代码。

以下是一个 if 初始化的示例:

#include <iostream>
int main()
{
    if (int x = 42; x > 0) {
        std::cout << "x is positive" << std::endl;
    } else {
        std::cout << "x is not positive" << std::endl;
    }
    return 0;
}

在这个示例中,我们在 if 语句中初始化了一个整数变量 x,并检查它是否大于 0。如果 x 大于 0,则输出 “x is positive”,否则输出 “x is not positive”。

需要注意的是,在 if 语句块外部,变量 x 是不可见的。这个特性可以避免在不必要的情况下创建不必要的变量,并提高代码的可读性和可维护性。

if 初始化特性可以应用于任何条件语句,包括 if、while、for、switch 和 do-while。在 while 和 for 循环中使用 if 初始化特性可以避免重复计算,提高代码效率。

下面是一个 while 循环中使用 if 初始化特性的示例:

#include <iostream>
int main()
{
    int i = 0;
    while (int x = i * 2; x < 10) {
        std::cout << x << std::endl;
        i++;
    }
    return 0;
}

在这个示例中,我们在 while 循环中初始化了一个整数变量 x,并检查它是否小于 10。如果 x 小于 10,则输出 x 的值并增加 i 的值,然后重新计算 x 的值。这样可以避免在循环体内重复计算 x 的值,提高代码效率。

4 c++ 17 UTF-8字符字面量

在C++17中,引入了UTF-8字符字面量,使得C++能够更方便地处理Unicode字符。

UTF-8字符字面量是以“u8”作为前缀的字符串字面量,例如:

c++

Copy code

const char* str = u8"Hello, 世界!“;

这个字符串包含了英文单词"Hello"和中文"世界”,使用UTF-8编码。

在C++17中,UTF-8字符字面量不仅可以在字符串字面量中使用,还可以在字符字面量中使用,例如:

c++

Copy code

char c = u8’世’;

这个字符变量包含了一个中文字符"世",使用UTF-8编码。

使用UTF-8字符字面量可以使得代码更易于阅读和编写,尤其是需要处理Unicode字符的程序。


相关文章
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
367 15
|
8月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
702 12
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
484 12
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
279 8
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
455 59
|
安全 编译器 C++
【C++11】新特性
`C++11`是2011年发布的`C++`重要版本,引入了约140个新特性和600个缺陷修复。其中,列表初始化(List Initialization)提供了一种更统一、更灵活和更安全的初始化方式,支持内置类型和满足特定条件的自定义类型。此外,`C++11`还引入了`auto`关键字用于自动类型推导,简化了复杂类型的声明,提高了代码的可读性和可维护性。`decltype`则用于根据表达式推导类型,增强了编译时类型检查的能力,特别适用于模板和泛型编程。
230 2
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
463 5
C++ 20新特性之结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。
299 0
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
10月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
261 0