linux c static 和extern区别

本文解析了C语言中static与extern关键字的区别与应用。对于变量,extern用于声明变量存在于其他文件中,而static则限定变量作用域仅限于当前文件。对于函数,extern为默认状态允许外部调用,static则限制其仅在当前文件内调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在看一个源码的时候,发现对于static 和extern 还是不太理解,so 又stackoverflow一发,记录一下。

extern

在linux c 中,extern对于variable和function是不一样的

variable

对于variable来说,extern就是一个声明,声明目标文件在链接

的时候把几个变量链接到一起,相当于超链接或者软连接是一个道理
是一个映射,在链接的时候映射到一起,达到分享变量的目的。extern
不会分配内存,需要先声明再分配内存才可以使用,所有引用该变量的
的文件引用同一个内存,在链接文件的全局初始化段里面。
而static就是和extern相反,static声明的变量只在自己文件内部
编译,不能被链接到别的文件。引用static声明的源文件,在编译的时
候会在每一个包含文件(static声明文件)中,生成一个副本从而达到
不分享变量的目的。

function

对于function来说,extern是function的默认声明,也就是外部可以

引用,如果不想被引用就用static修饰。相当于Java/c++ 的public声明
static就是private声明。

### Linux C/C++ Static 关键字详解 #### 静态全局变量 在C/C++中,`static`关键字用于改变程序元素的链接属性。对于全局变量而言,在其声明前加上`static`修饰符会将其作用范围限制于当前文件内[^1]。 ```cpp // fileA.cpp #include <iostream> using namespace std; static int globalVar = 10; // 只能在fileA.cpp内部使用的全局变量 void printGlobal() { cout << "globalVar in fileA: " << globalVar << endl; } ``` 尝试从其他源文件访问此静态全局变量将会导致编译错误: ```cpp // fileB.cpp extern int globalVar; // 将无法找到名为'globalVar'的外部符号 printGlobal(); ``` #### 静态局部变量 当应用于局部变量时,`static`使得该变量在整个程序执行期间都保持存在,并且仅初始化一次。这意味着即使函数返回后,这些变量仍然保留上次调用结束后的状态。 ```cpp void countCalls() { static int callCount = 0; // 初始化只发生一次 ++callCount; printf("Function has been called %d times.\n", callCount); } int main() { for (int i = 0; i < 5; ++i) { countCalls(); // 输出显示每次调用次数增加 } return 0; } ``` #### 静态函数 通过给定函数添加`static`限定词,可以将函数的作用域局限于定义它的翻译单元(即同一个`.cpp`文件)。这有助于隐藏实现细节并减少名称空间污染的风险。 ```cpp // 定义为静态函数 static void helperFunc() { /* ... */ } // 此处helperFunc不可被其它文件中的代码所见 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值