C语言中全局变量的定义与调用

本文深入解析了谭浩强书中关于全局变量的定义、如何通过extern和static进行声明,以及使用全局变量时需要注意的重要细节。

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

1. 谭浩强 书中对‘全局变量’的定义

    在函数内定义的变量是局部变量,而在函数外定义的变量叫做外部变量,外部变量是全局变量。全局变量可以为本文件中其他函数所共用它的有效范围从定义变量的位置开始到本源文件结束。

    建立全局变量的作用是增加了函数间数据联系的渠道。

2.  谭浩强 书中对‘全局变量’的声明

    用extern声明:

       如果外部变量不在文件的开头定义,其有效的作用范围只能从定义点到文件结束。如果在定义点之前的函数想引用该外部变量,则应该在应用之前用关键字extern对该变量作‘外部变量声明’。表示该变量是一个已经定义了的外部变量。有了此声明,就可以从声明处起,合法的调用该外部变量。

 

      

int  A=13, B=-8;

....

main()

{

    extern int A,B;//也可以写成extern A,B;

    ....

    用static声明:

        有时在程序中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这时就可以在定义外部变量时在其前面加一个static声明。此时的外部变量也成为静态全局变量。

       

static int A;

3. 需要注意的地方

   外部变量的定义和声明是不同的。外部变量的定义只能有一次,它的位置在所有函数之外,而统一文件中的外部变量的声明可以有多次,它的位置可以在函数之内,也可以在函数之外。系统根据外部变量的定义,而不是声明,分配存储单元。对外部变量的初始化,只能在定义时进行,而不能在声明中进行

<think>我们正在讨论C语言全局变量定义调用方法。根据引用内容,我们可以总结如下: 1. **定义全局变量**:在函数外部定义的变量就是全局变量。例如: ```c int globalVar; // 全局变量定义 ``` 2. **在同一文件内使用**:在定义之后,同一个文件内的函数可以直接使用它。 3. **在不同文件内使用**:如果要在另一个文件中使用同一个全局变量,需要用`extern`关键字声明。例如,在`file1.c`中定义: ```c int globalVar = 0; // 定义并初始化 ``` 在`file2.c`中使用: ```c extern int globalVar; // 声明,表示这个变量在其他文件中定义 ``` 4. **注意事项**: - 全局变量的作用域从定义处开始到文件结束,但通过`extern`声明可以扩展其作用域(从声明处开始)。 - 避免在头文件中直接定义全局变量(因为头文件可能被多个源文件包含,导致重复定义)。通常做法是在一个源文件中定义,然后在头文件中用`extern`声明,其他文件包含该头文件即可使用。 - 全局变量局部变量重名时,局部变量会覆盖全局变量(在局部作用域内)。 - 全局变量在程序运行期间一直存在,占用固定的内存空间。 5. **示例代码**: **file1.c**: ```c #include <stdio.h> int globalVar = 10; // 定义全局变量并初始化 void func() { globalVar = 20; // 修改全局变量 } int main() { printf("Before: %d\n", globalVar); // 输出10 func(); printf("After: %d\n", globalVar); // 输出20 return 0; } ``` **file2.c** (如果需要在另一个文件中使用): ```c #include <stdio.h> extern int globalVar; // 声明全局变量定义在file1.c中) void anotherFunc() { printf("In another file: %d\n", globalVar); } ``` 6. **关于头文件的使用**(推荐做法): 我们可以创建一个头文件(如`globals.h`)来声明全局变量,然后在定义全局变量的源文件中包含这个头文件,同时在其他需要使用该全局变量的源文件中也包含这个头文件。 **globals.h**: ```c #ifndef GLOBALS_H #define GLOBALS_H extern int globalVar; // 声明全局变量(注意:这里只是声明,不是定义) #endif ``` **file1.c** (定义全局变量): ```c #include "globals.h" int globalVar = 0; // 实际定义全局变量 ``` **file2.c** (使用全局变量): ```c #include "globals.h" void someFunction() { globalVar = 100; // 使用全局变量 } ``` 注意:使用全局变量要谨慎,因为它会增加模块间的耦合,且可能被任意修改,导致程序难以维护和调试。在必须使用全局变量时,应尽量通过函数来访问和修改,以控制对其的访问。 §§相关问题§§ 1. 全局变量和局部变量有什么区别? 2. 使用全局变量有哪些优缺点? 3. 如何避免多个文件包含同一个全局变量定义导致的重复定义错误? 4. 在C语言中,静态全局变量(static global variable)有什么作用?</think>### C语言全局变量定义调用方法 在C语言中,全局变量定义在函数外部,其作用域覆盖整个程序(包括所有函数)。以下是具体操作方法: #### 1. **定义全局变量** 在函数外部直接声明变量(通常放在源文件顶部): ```c #include <stdio.h> int globalCounter = 0; // 定义并初始化全局变量 char systemStatus; // 定义未初始化的全局变量 ``` #### 2. **同一文件内调用** 在同一个源文件的函数中可直接使用: ```c void increment() { globalCounter++; // 直接修改全局变量 systemStatus = 'A'; } int main() { printf("初始值: %d\n", globalCounter); // 直接读取 increment(); printf("修改后: %d\n", globalCounter); // 输出: 修改后: 1 return 0; } ``` #### 3. **跨文件调用(需`extern`声明)** 当全局变量定义在文件A,需要在文件B使用时: **fileA.c**: ```c // 定义全局变量 float sensorData = 25.5; ``` **fileB.c**: ```c #include <stdio.h> extern float sensorData; // 声明引用外部全局变量 void display() { printf("传感器数据: %.1f\n", sensorData); // 输出: 传感器数据: 25.5 } ``` #### 4. **头文件管理全局变量(推荐)** 通过头文件统一管理声明: **globals.h**: ```c #ifndef GLOBALS_H #define GLOBALS_H extern int globalCounter; // 声明(非定义) extern char systemStatus; #endif ``` **main.c**: ```c #include "globals.h" int globalCounter = 0; // 实际定义 char systemStatus = 'I'; // 实际定义 ``` **utils.c**: ```c #include "globals.h" // 包含声明 void resetSystem() { globalCounter = 0; // 跨文件修改 systemStatus = 'R'; } ``` ### 关键注意事项 1. **避免重复定义** `extern`仅用于声明(不分配内存),定义必须在**一个源文件**中完成[^4]。 2. **作用域冲突** 局部变量优先于同名的全局变量: ```c int x = 10; // 全局变量 void test() { int x = 20; // 局部变量覆盖全局变量 printf("%d", x); // 输出20 } ``` 3. **内存性能** - ✅ 全局变量存储在静态存储区,访问速度快[^2] - ❌ 过度使用会增加内存占用和耦合度 4. **多线程风险** 在中断或并发场景中,需加锁保护: ```c volatile int flag = 0; // 中断中修改时加volatile ``` > 最佳实践:尽量通过函数封装全局变量的访问,如`getCounter()`/`setCounter()`,提高可维护性[^1]。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值