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

猜你喜欢

转载自blog.csdn.net/weixin_42445727/article/details/129934098