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.c
和b.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
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>
(全文完)