头文件+全局变量

//3个头文件3个.cpp

//test3.h

#pragma once
#include <iostream>
using namespace std;
static int func()
{
	cout << "我要加static,因为test1.cpp和test2.cpp都调用了我" << endl;
	return 0;
}
static int func3()
{
	cout << "我要加static,因为test1.cpp和test2.cpp都调用了我" << endl;
	return 0;
}

 static int d=0;
 inline void func4()
 {
	 cout << "我是test3.h的内联函数" << endl;
 }

 class test
 {
 public:
		 void printf() 
		 {
			 cout << "我是test3.h类的成员函数" << endl;
		 }
 public:
	 int e = 5;
	
 };
 extern int TEST;
 void set_TEST(int n);//设置接口初始化全局变量
 int get_TEST();//设置接口访问全局变量

//test1.h

#pragma once
#include <iostream>
#include"test3.h"
using namespace std;
int func1();
extern int c;
//test B;重定义

//test1.cpp

#include <iostream>
#include"test1.h"

using namespace std;
test B;
int func1()
{
	B.printf();//写在函数体内可以
	return func();
}
int c = 5;
/*******************************************************************************************
*只能在函数体内调用函数,函数体外只能定义全局变量或者对象
********************************************************************************************/
//test B;
//B.printf();
int TEST;//全局变量声明要放在函数体外
void set_TEST(int n)
{
	//int TEST = n;//err
    TEST = n;
	return;
}
int get_TEST()
{
	return TEST;
}

//test2.h

#pragma once
#include <iostream>
#include"test3.h"
using namespace std;
int func2();
extern int b ;
 //test A;重定义

//test2.cpp

#include <iostream>
#include"test2.h"
using namespace std;
test A;
int func2()
{
	A.printf();
	return func();
}
int b = 5;

//main.cpp

#include <iostream>
#include"test2.h"
#include"test1.h"

using namespace std;
/*******************************************************************************************
* 变量的声明可以有多次,但定义只能有一次
* 声明:用于向程序表明变量的类型和名字。不需要建立存储空间的。
* 定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。
* 变量的声明和定义主要的区别:是否分配存储空间。
* 定义也是声明。
*  extern声明(extern int a;//声明变量)不是定义,也不分配存储空间。事实上它只是说明变量定义在程序的其他地方。
* 如果声明有初始化式,就被当作定义,即使前面加了extern。 只有当extern声明位于函数外部时,才可以被初始化。extern int a=0;//声明变量   int a;->重定义
* .函数的声明和定义区别比较简单,除非有extern关键字,否则带有{ }的就是定义,其余的就是声明。
********************************************************************************************/
int func3();
int func3();
//int a;
//int a;->重定义
extern int a = 0;//声明变量(并且在函数外部不可再改)
//a = 5;//重定义
/*******************************************************************************************
一般情况下头文件中只放变量的声明,因为头文件要被其他文件包含(即#include),如果把定义放到头文件的话,就不能避免多次定义变量,C++不允许多次定义变量,一个程序中对指定变量的定义只有一次,声明可以无数次。
不过有三个例外,一下三中实体的定义也可放到头文件中。

*1.值在编译时就已知的const 变量的定义可以放到头文件中如:const int num(10);
*2.类的定义可以放到头文件中
*3.inline 函数
********************************************************************************************/

/*******************************************************************************************

*(1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;

*(2) 某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;

*(3) 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;

*(4) 永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。
********************************************************************************************/
int main()
{
/*******************************************************************************************

*要想引用test1.h的函数func1(),要在test3.h文件里加extern前缀,因为test1.h和test2.h都引用了test3.h定义的func();
* 否则.obj就会出现重定义。
********************************************************************************************/
	func1();
/*******************************************************************************************

*要想引用test1.h和test2.h的变量,变量要在头文件里加extern前缀,在相应的.cpp 里定义;
* 否则.obj就会出现重定义。
********************************************************************************************/
	cout<<b<<c<<endl;
/*******************************************************************************************
*没加test3.h也可以使用它里面的函数;
********************************************************************************************/
	func3();
/*******************************************************************************************
*头文件里定义了变量要加static;
********************************************************************************************/
	cout << d << endl;
/*******************************************************************************************
*C++规定,内联函数可以在程序中定义多次,因此头文件中可以写内联函数(inline)的定义;
********************************************************************************************/
	func4();
/*******************************************************************************************
*只能在函数体内调用函数,函数体外只能定义全局变量或者对象
********************************************************************************************/
	test C;
	C.printf();
/*******************************************************************************************
*全局变量
* 1. 能不用全局变量尽量不用;
* 2.如果只有某.c文件用,就static到该文件中;
*3.如果只有一个函数用,那就static到函数里面去;
*4.如果非要开放出去让人读取,那就用函数return出去,这样就是只读属性了;
*5.如果非要遭人蹂躏赋值,好吧,我开放函数接口让你传参赋值;
*6.实在非要extern**我,我还可以严格控制包含我.h档的对象,而不是放到公共的includes.h中被人围观,丢人现眼。
********************************************************************************************/
	set_TEST(5);
	int n = get_TEST();
	cout<<"我是全局变量TEST:"<<n<<endl;
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值