static && extern

本文深入解析C语言中static和extern关键字的使用场景与效果,包括它们如何影响变量的作用域和函数的可见性。通过具体示例展示如何在不同文档间共享变量与函数,并解释在C与C++混合编程中extern的特殊用途。
一,static和extern:
大工程下我们会碰到很多源文档。
                
文档a.c
static int i; //只在a文档中用
int j;    //在工程里用
static void init()         //只在a文档中用
{
}
void callme()          //在工程中用
{
   static int sum;
}

上面的全局i变量和init()函数只能用在a.c文档中,全局变量sum的作用域只在callme里。变量j和函数callme()的全局限扩充到整个工程文档。所以能够在下面的b.c中用extern关键字调用。extern告诉编译器这个变量或函数在其他文档里已被定义了。
文档b.c
extern int j;     //调用a文档里的
extern void callme();  //调用a文档里的
int main()
{
  ...
}

extern的另外用法是当C和C++混合编程时假如c++调用的是c源文档定义的函数或变量,那么要加extern来告诉编译器用c方式命名函数:
文档A.cpp调用a.c里面的变量i和函数callme()
extern "C"  //在c++文档里调用c文档中的变量
{
   int j;
   void callme();
}
int main()
{
   callme();
}

二,static法则:
    A、若全局变量仅在单个C文档中访问,则能够将这个变量修改为静态全局变量,以降低模块间的耦合度;
    B、若全局变量仅由单个函数访问,则能够将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
    C、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;

<think>我们被要求解释 `static extern` 在C语言中的含义。注意,这两个关键字在C语言中不能同时用于修饰同一个变量或函数。 </think>在C语言中,`static`和`extern`是两个重要的存储类说明符,它们用于控制变量和函数的链接属性和生命周期。**`static extern`的组合在语法上是无效的**,因为这两个关键字不能同时用于同一个声明。 ### 1. `static` 关键字详解 **作用**:限制变量或函数的作用域并修改生命周期 #### 应用场景: ```c // 静态局部变量(函数内部) void func() { static int count = 0; // 只初始化一次 count++; printf("%d ", count); } // 调用2次: func(); func(); 输出: 1 2 // 静态全局变量(文件作用域) static int file_private = 42; // 仅当前文件可见 // 静态函数 static void private_func() { // 仅当前文件可调用 printf("File-private function\n"); } ``` **关键特性**: - 局部静态变量:生命周期延长至程序结束,但作用域仍为函数内部 - 全局静态变量/函数:文件作用域(内部链接),无法被其他文件通过`extern`访问 - 默认初始化为0(对于未显式初始化的变量) ### 2. `extern` 关键字详解 **作用**:声明(但不定义)在其他文件中定义的变量或函数 #### 应用场景: ```c // File1.c int global_var = 10; // 实际定义 void global_func() { ... } // 实际定义 // File2.c extern int global_var; // 声明(非定义) extern void global_func(); // 声明(非定义) int main() { global_var = 20; // 修改File1.c中的变量 global_func(); // 调用File1.c中的函数 return 0; } ``` **关键特性**: - 用于跨文件访问全局变量/函数 - 只是声明而非定义(不分配存储空间) - 要求被引用的变量/函数必须是非静态的(无`static`修饰) ### 3. 为什么 `static extern` 无效 ```c static extern int x; // 错误!无效组合 ``` **原因**: 1. `extern` 表示"此变量/函数在其他地方定义" 2. `static` 要求变量/函数具有文件作用域(内部链接) 3. 这两个要求相互矛盾:`extern`需要外部链接,`static`强制内部链接 **编译器行为**: - GCC警告:`warning: useless 'static' in empty declaration` - Clang错误:`error: cannot combine with previous 'extern' declaration specifier` ### 4. 正确用法示例 #### a) 文件私有全局变量(static) ```c // File.c static int counter = 0; // 仅本文件可见 void increment() { counter++; } ``` #### b) 跨文件共享变量(extern) ```c // Globals.h extern int shared_var; // 声明(头文件中) // File1.c #include "Globals.h" int shared_var = 100; // 实际定义 // File2.c #include "Globals.h" void print_var() { printf("%d\n", shared_var); // 访问File1.c的定义 } ``` #### c) 跨文件共享函数 ```c // MathUtil.h extern int add(int a, int b); // 函数声明 // MathUtil.c #include "MathUtil.h" int add(int a, int b) { // 实际定义 return a + b; } // Main.c #include "MathUtil.h" int main() { printf("5+3=%d\n", add(5, 3)); // 调用其他文件函数 return 0; } ``` ### 5. 链接类型总结 | 声明方式 | 存储期 | 链接属性 | 作用域 | |------------------|----------|--------------|----------------| | `int var;` | 静态 | 外部链接 | 所有文件 | | `static int var;`| 静态 | 内部链接 | 当前文件 | | `extern int var;`| 静态 | 外部链接引用 | 声明作用域 | | `auto int var;` | 自动 | 无链接 | 块作用域 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值