C语言的外部变量

本文详细解析了C语言中外部变量的定义、初始化与作用域等特性,包括extern与static关键字的应用,以及如何正确声明与定义外部变量。

C语言的存储类型可分为:extern、auto、static、register。

外部变量定义在函数之外,通过同一个名字对外部变量的所有引用(即使这种引用来自于单独编译的不同函数),实际上都是引用同一个对外部变量的所有引用(C标准中把这一性质称为外部链接)。因此外部变量可以在全局范围内访问。

外部变量的初始化:

    1、初始化表达式必须是常量表达式;

    2、只能初始化一次;

    3、在不进行显示初始化的情况下,外部变量将被初始化为0;

外部变量的作用域:

    1、从声明它的地方开始,到其所在的文件结尾结束;

    2、如果要在外部变量的定义之前使用该变量,或者外部变量的定义与变量的使用不在同一个文件夹中,则必须在相应的变量声明中强制地使用关键字extern

这里要具体的讲一下:一个外部变量在默认的情况下只能在定义它的编译单元内被访问,如果要在别的编译单元内可访问,则需使用关键字extern;若要外部变量只能在同一个编译单元被调用(也即不允许其他编译单元通过extern关键字访问到该变量),则需使用关键字static。很乱是吧!呵呵,看代码:

不加关键字static,在其他的编译单元(test2.c)可以访问到test1.c中的变量。

//test1.c
int COMMON_VALUE = 100;

//test2.c
extern COMMON_VALUE;

如果test1.c如下所示,则在test2.c是无法访问到的

//test1.c
static int COMMON_VALUE = 100;

extern和static的属性可以应用在公用头文件中:

假设有这样几个文件commonDef.h, test1.c, test2.c. 其中test1.c和test2.c包含公用的头文件commonDef.h.

方法一:

//commonDef.h
#ifndef __COMMON_DEF_H
#define __COMMON_DEF_H

static int COMMON_VALUE = 100;

#endif

这时候在test1.c和test2.c直接#include"commonDef.h"即可。

static关键字保证了包含该头文件的编译单元分别拥有该变量的独立实体,如同在每一个源文件分别定义一次;若不加static,则会造成“redifinition”。

方法二:

//commonDef.h
#ifndef __COMMON_DEF_H
#define __COMMON_DEF_H

extern int COMMON_VALUE;

#endif

//test1.c
#include "commonDef.h"
int COMMON_VALUE = 100;

//test2.c
#include "commonDef.h"

也即在公用头文件中,使用extern关键字。然后再某一个源文件中定义一次,再在每一个使用它的编译单元中包含该头文件即可。


总结:C语言中,外部变量的默认的连接类型是extern, 即外连接。


注意:

将外部变量的声明定义区分开来很重要:

    变量的声明用于说明变量的属性(主要是变量的类型);变量的定义除此之外还要引起存储器的分配。




### C语言外部变量、全局变量和`extern`的使用方法 #### 什么是外部变量? 在C语言中,外部变量是指那些可以在多个源文件之间共享的变量。这些变量通常被声明为全局变量,并通过`extern`关键字来实现跨文件访问。 #### `extern`的作用 `extern`是一个存储类说明符,用于告知编译器某个变量或函数已经在其他地方定义过了。因此,在当前文件中只需要对其进行声明即可[^3]。这种机制允许程序的不同部分能够访问同一个全局变量或调用相同的函数。 #### 定义与声明的区别 - **定义**:分配内存空间并可能初始化值的操作。 - **声明**:仅通知编译器存在这样一个实体(变量或者函数),并不涉及实际的空间分配。 当我们在一个文件里定义了一个全局变量之后,可以通过另一个文件里的`extern`声明来引用这个已经存在的变量而不需要再次为其分配新的存储位置[^1]。 #### 如何正确地使用`extern` 假设我们有两个文件main.c 和 data.c: ##### 文件data.c 中的内容如下: ```c // 这是对ex_num 的定义 int ex_num = 20; ``` ##### 文件main.c 中可以这样写: ```c #include <stdio.h> // 声明来自data.c 的外部变量 extern int ex_num; void print_exnum() { printf("The value of external variable is %d\n", ex_num); } int main(){ print_exnum(); return 0; } ``` 在这个例子当中,虽然`ex_num` 被定义于"data.c" 当中,但是由于有对应的`extern` 声明语句存在于"main.c" ,所以后者同样能正常操作前者所拥有的数据[^2]。 #### 关键点总结 - 如果只是希望让别的模块知道某变量的存在而不重新创建它,则应该采用`extern` 来做简单的声明而不是重复定义。 - 对于常量类型的处理需要注意特殊规则——即如果打算把const 类型作为可导出资源供其它单元利用的话,记得加上`extern`修饰词;而且首次出现的时候就应当给予初始赋值[^4]。 #### 示例代码展示 下面给出一段完整的示例代码用来演示如何运用上述概念完成多文件间的通信功能: File: global_var.h ```cpp #ifndef GLOBAL_VAR_H_ #define GLOBAL_VAR_H_ extern int shared_variable; #endif /*GLOBAL_VAR_H_*/ ``` File: fileA.c ```cpp #include "global_var.h" int shared_variable = 100; // 此处完成了shared_variable的实际定义 ``` File: fileB.c ```cpp #include <stdio.h> #include "global_var.h" void displaySharedValue(void){ printf("Shared Variable Value:%d \n ",shared_variable ); } ``` File: main.c ```cpp #include <stdio.h> #include "fileB.c" #include "global_var.h" int main(){ shared_variable +=50 ; displaySharedValue(); return 0 ; } ``` 运行结果将会打印出增加后的数值150. ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值