0%

static、extern和inline

static、extern和inline

在实习写C++的时候遇到static、extern和inline相关的概念和使用,记录一下

static

static关键字作用很多,这里主要说明static变量。static变量生命周期是整个程序,可见性是文件可见(这些都是很基础的知识)
但是需要注意的是假如我们在头文件中定义了一个static变量(这里假设为staticVar),那么包含这个头文件的文件都会有这样一个变量staticVar不会发生冲突。这个特性有时候有用,但是绝大多数情况还是没有用的,而且会浪费空间,不建议使用

1
2
3
4
5
6
7
8
9
// 头文件A.h 
static int staticVar = 0;

// 源文件B.cpp
#include "A.h" // B.cpp中包含一个 staticVar

// 源文件C.cpp
#include "A.h" // C.cpp中包含一个 staticVar

extern

extern关键字在C++中用来声明全局变量,它用来告诉编译器,这个变量在其他文件中定义的,以避免重复定义。

1
2
3
4
5
6
7
8
9
10
11
// 源文件 A.cpp
int globalVariable = 10; // 定义全局变量

// 源文件 B.cpp
extern int globalVariable; // 声明全局变量

int main() {
// 使用全局变量
globalVariable = 20;
return 0;
}

有的时候我们可以在头文件中使用extern声明一个变量,在某个源文件中进行定义,然后其他包含这个头文件的源文件就都有这个变量的声明,它们共享一份内容。

inline

inline关键字修饰函数,用于向编译器提供函数内联的建议,但是我没有想到inline关键字可以解决跨模块(动态库)的使用函数的问题。
比如我有一个动态库A(A.dll)和一个动态库B(B.dll),动态库B使用了A里面的函数,但是B在链接的时候A还没有编译,这个时候可以将A里面的函数加上inline进行修饰,就不会报符号找不到的问题。
底层来看是因为inline关键字修饰的函数,在调用的时候会进行展开,这样就不会查找这个符号,但是这个特性确实有时候可以解决这样类似的编译问题。