[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字符的程序。


相关文章
|
1月前
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
104 59
|
1月前
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
35 5
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(三)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(二)
【C++】面向对象编程的三大特性:深入解析多态机制
|
28天前
|
C++
C++ 20新特性之结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。
32 0
|
1月前
|
存储 编译器 C语言
深入计算机语言之C++:类与对象(上)
深入计算机语言之C++:类与对象(上)
|
1月前
|
存储 分布式计算 编译器
深入计算机语言之C++:C到C++的过度-2
深入计算机语言之C++:C到C++的过度-2
|
1月前
|
编译器 Linux C语言
深入计算机语言之C++:C到C++的过度-1
深入计算机语言之C++:C到C++的过度-1
|
1月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
19 0
|
8天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
36 4