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