一文搞懂C++全局变量
C++的全局变量分为两类:一、文件全局变量;二、工程全局变量。这两类全局变量的定义和使用方式是不同的.......
C++的全局变量分为两类:
一、文件全局变量
二、工程全局变量
一、文件全局变量
“文件全局变量”就是写在函数之外的变量,变量定义了之后,可以在当前整个文件的任何一处使用。例如:
int globalInt = 5;
int main(int argc,char* argv[]){
......
}
变量globalInt就是一个“文件全局变量”,实际上,作为“文件全局变量”,上面的写法还不严格,严格定义一个“文件全局变量”写法如下:
static int globalInt = 5;
通过在前面增加static关键字,就可以确保globalInt变量只在当前文件中全局有效了。
二、工程全局变量
所谓“工程全局变量”就是在整个C++项目工程中都可以使用的全局变量。
在一个C++项目工程中,所有文件到最后都会被编译在一起,这个时候“文件全局变量”就会发生重名问题。
例如:
在a.cpp文件中有一个“文件全局变量”:globalInt
int globalInt = 5;
在b.cpp文件中也有一个“文件全局变量”:globalInt
int globalInt = 12;
这种情况下,编译器就搞不清楚到底在函数中要使用哪一个globalInt,这里有两种解决方案:
1、使用“工程全局变量”,所有文件使用同一个全局变量。
a.cpp文件中的变量定义不用修改:
int globalInt = 5;
b.cpp文件中修改为变量声明:
extern int globalInt;
注意:此处是变量声明,不能赋初值;因为a.cpp文件中已经有了变量定义,所以此处只需声明即可,如果需要修改globalInt的值,另起一行再加赋值语句就可以了。
这样设置之后,在a.cpp和b.cpp文件中都可以对globalInt进行操作了,读、写均可,记住:这是同一个变量。
2、使用“文件全局变量”,各自使用自己的“文件全局变量”。
a.cpp文件中的变量定义不用修改:
int globalInt = 5;
b.cpp文件中修改为:
static int globalInt = 12; //定义了一个仅在当前文件中使用的全局变量globalInt,staic仅标示当前文件中可用,globalInt的值仍然可以修改,还是变量,不是常量。
另外:定义常量可以使用宏:define,例如
#define myCon 567
多说一句:函数也具有工程全局和文件全局之分,快去试试吧!
以下是实例代码,并使用Makefile进行编译和运行,注意仔细查看代码中的注释:
D:\YcjWork\CPP>vim a.cpp
#include "project.h"
#include <iostream>
int globalInt = 5;
using namespace std;
int main(int argc, char* argv[]){
int globalInt = 30;
cout << "参数个数:" << argc << endl;
//调用add()函数
cout << "和为:" << add(15, 18) << endl;
//使用局部变量globalInt
cout << "1 globalInt:" << globalInt << endl;
cout << "\nprint:" << endl;
print();
return 0;
}
int add(int a, int b){
//使用全局变量globalInt
cout << "2 globalInt:" << globalInt << endl;
return a+b;
}
D:\YcjWork\CPP>vim b.cpp
#include <iostream>
#define N 530
static int globalIntB = 23;
static int globalInt = 12; //此声明有效
extern int globalInt; //此句无效,因上句的优先级更高
using namespace std;
//使用static定义一个只在本文件中才能调用的add()函数
static int add(int a, int b){
cout << "1 globalIntB: " << globalIntB << endl;
globalIntB++;
cout << "2 globalIntB: " << globalIntB << endl;
//调用本文件中static定义的globalInt
globalInt++;
cout << "3 globalInt: " << globalInt << endl;
cout << "N为:" << N << endl;
return a+b;
}
void print(){
int a = add(3,8); //调用static add()函数
cout << "a:" << a << endl;
}
D:\YcjWork\CPP>vim Makefile
default: gpp
gpp: a.cpp b.cpp
g++ a.cpp b.cpp -o a.exe
run:
a.exe
D:\YcjWork\CPP>vim project.h
//头文件中声明所有的函数
int add(int a, int b);
void print();
编译、运行
D:\YcjWork\CPP>make
g++ a.cpp b.cpp -o a.exe
D:\YcjWork\CPP>make run
a.exe
参数个数:1
和为:2 globalInt:5
33
1 globalInt:30
print:
1 globalIntB: 23
2 globalIntB: 24
3 globalInt: 13
N为:530
a:11
D:\YcjWork\CPP>
运行截屏

(全文完)
更多推荐



所有评论(0)