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


目录
相关文章
|
18天前
|
C语言 C++ 开发者
深入探索C++:特性、代码实践及流程图解析
深入探索C++:特性、代码实践及流程图解析
|
5天前
|
自然语言处理 编译器 C语言
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
本文章是我对C++学习的开始,很荣幸与大家一同进步。 首先我先介绍一下C++,C++是上个世纪为了解决软件危机所创立 的一项面向对象的编程语言(OOP思想)。
30 1
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
|
6天前
|
算法 C++
【C++入门到精通】condition_variable(条件变量)C++11 [ C++入门 ]
【C++入门到精通】condition_variable(条件变量)C++11 [ C++入门 ]
9 0
|
7天前
|
存储 安全 编译器
【C++】基础知识讲解(引用、内联、auto,基于范围for循环)
【C++】基础知识讲解(引用、内联、auto,基于范围for循环)
16 1
|
12天前
|
编译器 C++
【C++】【C++的常变量取地址问题(对比C的不同)】const修饰的常变量&volatile修饰用法详解(代码演示)
【C++】【C++的常变量取地址问题(对比C的不同)】const修饰的常变量&volatile修饰用法详解(代码演示)
|
14天前
|
Linux 程序员 图形学
C++语言在现代软件开发中的应用与实践
C++语言在现代软件开发中的应用与实践
20 2
|
14天前
|
存储 程序员 C语言
深入理解C++:从语言特性到实践应用
深入理解C++:从语言特性到实践应用
24 3
|
14天前
|
存储 算法 安全
C++语言深度探索:从基础到实践
C++语言深度探索:从基础到实践
14 2
|
19天前
|
存储 程序员 编译器
C++从入门到精通:1.1.1基础语法之变量
C++从入门到精通:1.1.1基础语法之变量
|
6天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
16 0