extern
和static
是C/C++中用于控制变量或函数链接性和可见性的关键字,它们各自有不同的作用。
extern
extern
关键字用于声明一个变量或函数是在别的文件中定义的,或者是在本文件的其他地方定义的。它告诉编译器该变量或函数不是在本文件中定义的,而是在其他地方定义,因此编译器在链接阶段需要找到它的定义。extern
通常用于以下几种情况:
- 全局变量的外部链接:当你在一个源文件中定义了一个全局变量,并希望在另一个或多个源文件中访问它时,你需要在那些源文件中使用
extern
来声明这个变量。 - 函数的声明:虽然函数的声明(即原型)通常不需要
extern
(因为默认情况下函数就有外部链接),但在某些上下文中(如老式的代码或特定的编译器/链接器行为),你可能会看到extern
用于函数的声明。然而,在现代C/C++编程中,这通常是不必要的。
static
static
关键字用于控制变量的存储持续时间和链接性,以及函数的链接性。它有几个不同的用途,但在这里我们主要关注其对变量和函数的影响:
- 局部静态变量:在函数内部声明的静态变量具有局部作用域(只能在定义它的函数内部访问),但其生命周期贯穿整个程序的执行期间。这意呀着,即使在函数执行完毕后,局部静态变量的值也会保留,并在下次函数调用时继续使用。
- 全局静态变量:在全局作用域(即文件作用域)中声明的静态变量具有文件作用域(即只能在定义它的文件内部访问),但具有静态存储持续时间(从程序开始到结束)。这与全局变量类似,但全局静态变量不会在其他文件中引起链接问题,因为它们是隐藏的,不会被其他文件看到。
- 静态函数:静态函数只能在定义它的文件内部被调用,这有助于封装和避免命名冲突。静态函数具有内部链接性,这意味着它们的标识符在链接过程中不会与其他文件中的标识符冲突。
总结
extern
用于声明一个变量或函数是在其他地方定义的,以便在当前作用域中访问它。static
用于控制变量的存储持续时间和链接性(以及函数的链接性),使得变量或函数具有局部作用域或文件作用域,而不是全局作用域。对于变量,static
还意味着其值在程序执行期间保持不变(对于局部静态变量而言)。