一文搞懂C语言的全局变量

C语言的全局变量分为两类:
一、文件全局变量
二、工程全局变量

一、文件全局变量

“文件全局变量”就是写在函数之外的变量,变量定义了之后,可以在当前整个文件的任何一处使用。例如:

int globalInt = 5;
int main(int argc,char* argv[]){
	......
}

变量globalInt就是一个“文件全局变量”,实际上,作为“文件全局变量”,上面的写法还不严格,严格定义一个“文件全局变量”写法如下:

static int globalInt = 5;

通过在前面增加static关键字,就可以确保globalInt变量只在当前文件中全局有效了。

二、工程全局变量

所谓“工程全局变量”就是在整个C项目工程中都可以使用的全局变量。
在一个C项目工程中,所有文件到最后都会被编译在一起,这个时候“文件全局变量”就会发生重名问题。
例如:
a.c文件中有一个“文件全局变量”:globalInt

int globalInt = 5;

b.c文件中也有一个“文件全局变量”:globalInt

int globalInt = 12;

这种情况下,编译器就搞不清楚到底在函数中要使用哪一个globalInt,这里有两种解决方案:

1、使用“工程全局变量”,所有文件使用同一个全局变量。

a.c文件中的变量定义不用修改:

int globalInt = 5;

b.c文件中修改为变量声明:

extern int globalInt;

注意:此处是变量声明,不能赋初值;因为a.c文件中已经有了变量定义,所以此处只需声明即可,如果需要修改globalInt的值,另起一行再加操作语句就可以了。
这样设置之后,在a.cb.c文件中都可以对globalInt进行操作了,读、写均可,记住:这是同一个变量。

2、使用“文件全局变量”,各自使用自己的“文件全局变量”。

a.c文件中的变量定义不用修改:

int globalInt = 5;

b.c文件中修改为:

static int globalInt = 12; //定义了一个仅在当前文件中使用的全局变量globalInt,staic仅标示当前文件中可用,globalInt的值仍然可以修改,还是变量,不是常量。

另外:定义常量可以使用宏:define,例如

#define myCon 567

多说一句:函数也具有工程全局和文件全局之分,快去试试吧!

以下是测试代码:
E:\mywork\C\var\a.c

#include "project.h"
#include <stdio.h>
int globalInt = 5;

int main(int argc,char* argv[]){
	int globalInt = 30;
	printf("参数个数:%d\n", argc);
	printf("和为:%d\n", add(15,18));
	printf("globalInt:%d\n",globalInt);
}

int add(int a, int b){
	printf("globalInt:%d\n",globalInt);
	return a+b;
}

E:\mywork\C\var\b.c

#include <stdio.h>
#define N 530
static int globalIntB = 23;
static int globalInt = 12;
extern int globalInt;

static int add(int a, int b){
	printf("globalIntB:%d\n",globalIntB);
	globalIntB++;
	printf("globalIntB:%d\n",globalIntB);
	globalInt++;
	printf("globalInt:%d\n",globalInt);
	printf("N为:%d\n", N);
	return a+b;
}

E:\mywork\C\var\Makefile

default : gcc

gcc : a.c b.c
	gcc a.c b.c -o a.exe 

run :
	a.exe

E:\mywork\C\var\project.h

int add(int a, int b);

编译、运行abc

编译、运行abc

E:\mywork\C\var>make
gcc a.c b.c -o a.exe

E:\mywork\C\var>make run
a.exe
参数个数:1
globalInt:5
和为:33
globalInt:30

E:\mywork\C\var>

(全文完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ycjnx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值