简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:理解extern关键字用法
2.extern关键字介绍
- 在C++中,
extern
关键字通常用于链接定义在别处声明的变量或函数。extern
有两个主要的用法:在函数前使用时,它允许在文件之间调用外部函数;在变量前使用时,它允许在不同的编译单元中引用变量。
在函数前使用:
- 如果你有一个函数在一个文件中被声明,但在另一个文件中被定义,那么你可以使用
extern "C"
来告诉编译器这个函数应该按照C语言的方式进行链接。
2.代码实例
1.外部变量
// 文件1:example1.cpp
#include <iostream>
extern int globalVar; // 在文件example2.cpp中定义
int main() {
std::cout << "The value of globalVar is: " << globalVar << std::endl;
return 0;
}
// 文件2:example2.cpp
#include <iostream>
int globalVar = 10; // 定义全局变量
int main() {
std::cout << "The value of globalVar is: " << globalVar << std::endl;
return 0;
}
在文件example1.cpp中使用了 extern
关键字声明了一个变量 globalVar
,然后在文件example2.cpp中定义并初始化了这个变量。然后在文件example1.cpp和文件example2.cpp中分别使用了这个变量。
2.外部函数
// 文件1:example3.cpp
#include <iostream>
extern void func(); // 在文件2中定义
int main() {
func(); // 调用外部函数
return 0;
}
// 文件2:example4.cpp
#include <iostream>
void func() { // 定义函数
std::cout << "This is an external function." << std::endl;
}
在文件example3.cpp中使用了 extern
关键字声明了一个函数 func
,然后在文件example4.cpp中定义了这个函数。
3.包含头文件
// 头文件(example5.h): 在这个文件中声明一个变量或函数,可以在多个源文件中使用。
#ifndef EXAMPLE5_H // 防止头文件被多次包含。
#define EXAMPLE5_H
extern int globalVar; // 在其他文件中定义。
#endif // EXAMPLE5_H
创建了一个头文件,其中使用 extern
关键字声明了一个变量 globalVar
,然后可以在其他源文件中包含这个头文件并使用该变量。
4.跨文件变量的初始化和赋值
// 文件1:example6.cpp
extern int var; // 在其他文件中定义并初始化。
int main() {
var = 42; // 赋值
return 0;
}
// 文件2:example7.cpp
int var; // 定义变量
在文件example6.cpp中使用了 extern
关键字声明了一个变量 var
,然后在文件example7.cpp中定义并初始化了这个变量。
5.在全局命名空间中使用变量
// 文件1:example8.cpp
extern int var; // 在全局命名空间中使用变量。
int main() {
var = 42;
return 0;
}
// 文件2:example9.cpp
int var; // 定义变量
在文件example8.cpp中使用了 extern
关键字声明了一个变量 var
,然后在文件example9.cpp中定义了这个变量。
6.链接外部库
// 文件1:example10.cpp
#include "example_library.h" // 包含库的头文件
int main() {
someFunction(); // 调用来自库的函数
return 0;
}
// example_library.h:定义库的函数和变量
#ifndef EXAMPLE_LIBRARY_H
#define EXAMPLE_LIBRARY_H
extern "C" {
void someFunction(); // 声明库中的函数
}
#endif // EXAMPLE_LIBRARY_H