C/C++中关于#include、extern关键字以及.h文件的思考

C/C++中关于#include、static、extern关键字以及.h.cpp文件的思考

#include语句的本质

  #include的本质是将#include"xxx.h"替换为xxx.h这个文件中的内容,比如下面的一个例子:

//a.h
#pragma once
void test1();
void test2();
void test3();
int test4();
int test5();

//main.cpp
#include "a.h"

int main() 
{

	return 0;
}

项目的目录结构如下:
在这里插入图片描述
  在VS中右击项目—>属性—>C++ —>命令行,在编辑框中填入/P,然后打开对应的文件右键选择编译,然后右击项目—>在文件管理器中打开文件夹,打开对应的.i文件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到main.i中的内容为

#line 1 "D:\\Desktop_D\\C++\\test\\testCpp\\main.cpp"

#line 1 "D:\\Desktop_D\\C++\\test\\testCpp\\a.h"
#pragma once
void test1();
void test2();
void test3();
int test4();
int test5();
#line 3 "D:\\Desktop_D\\C++\\test\\testCpp\\main.cpp"


int main() 
{

	return 0;
}

全局变量的使用

  全局变量可以定义在.cpp文件中,也可以定义在.h头文件中,变量存储在全局区,变量可以被其他文件中的函数使用,其他文件中使用的时候需要加上extern前缀以声明是来自外部的变量。例子如下:
定义的文件:main.cpp source1.cpp source2.cpp functions.h
main.cpp中的内容:

//main.cpp
#include <iostream>
#include "functions.h"
using namespace std;
int g_v;


int main() 
{
	g_v = 10;
	cout << "main中:" << g_v << endl;
	funcA();
	funcB();

	system("pause");
	return 0;
}

source1.cpp中内容:

//source1.cpp
#include <iostream>
#include "functions.h"
using namespace std;

void funcA()
{
	extern int g_v;

	g_v = 20;
	cout << "funcA中:" << g_v << endl;
}

source2.cpp中内容:

//source2.cpp
#include <iostream>
#include "functions.h"
using namespace std;

void funcB()
{
	extern int g_v;
	g_v = 30;
	cout << "funcB中:" << g_v << endl;
}

functions.h中内容:

//functions.h
#pragma once

void funcA();
void funcB();

运行main.cpp后结果如下:
在这里插入图片描述
  可见全局变量是可以在不同文件中使用的,这说明全局变量的作用域是统一工程下的所有文件?于是我在souce1.cpp中又定义了一个同名全局变量,并将原来的extern语句注释掉,其余的不变。修改后的source1.cpp如下:

//source1.cpp
#include <iostream>
#include "functions.h"
using namespace std;
int g_v;

void funcA()
{
	//extern int g_v;

	g_v = 20;
	cout << "funcA中:" << g_v << endl;
}

再次运行main.cpp发现报错了。
在这里插入图片描述
  所以个人认为,以后要尽量避免在程序中使用全局变量?再结合上面说的#include语句的本质,所以也要尽可能避免在头文件中声明全局变量?(文中的问句都是我自己的思考,不一定正确,如果哪里有错误的话请大佬指正)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值