迷惑的全局变量声明和定义说明

让人迷惑的全局变量声明和定义

  • 全局变量
    • 1.一个模块的组织形式
    • 2.全局变量的声明和定义的区别
      • (1)声明
      • (2)定义
    • 3.多文件引用
      • 总结

全局变量

全局变量定义在不同的地方有不同的表现,而且所谓重定义多发生在因为头文件定义了变量。
本次博客目标:解释什么是变量的定义和声明

1.一个模块的组织形式

一个模块的写作形式一般是这样的。
头文件.h:

	1>声明全局变量
	2>声明全局函数(加extern和不加效果是一样的,都可以被多文件调用)

源文件.cpp:

	1>定义全局变量(注意)
	2>定义函数(也就是写函数体内容)

2.全局变量的声明和定义的区别

(1)声明

	extern int global;
	extern double gd;
	struct student
	{
		char name[10];
		int score;
		int num;
	};  

(2)定义

	int global;
	或int global=10 ;
	struct student st1;

所以,对于基本数据类型不加extern时,都是定义。而变量的定义放在头文件就会在被引用时出现重定义错误(当然如果保证只有一个文件引用它,也不会报错),包括函数的定义也是如此。

3.多文件引用

头文件:test1.h
	#pragma once
	#include
	int stc_num=5 ;//这是定义,而非声明
	void sum(int a,int b);
	void add(int c,in d);
头文件:test1.cpp
	#pragma once
	#include“test1.h”
	void sum()
	{
	   实现函数体
	}
	void add()
	{
		函数体;
	}
头文件: test2.h,
	#pragma once
	#include
    extern int a;//这是声明
源文件: test2.cpp,
	#include"test2.h"
    int a=10;//这是定义,而且可以在其他文件中定义
主函数: main.cpp,
	#include
	#include"test1.h"
	#include"test2.h"
	int main()
	{
	     return 0;
	}

如上所示,main.cpp中引用了test1.h和test2.h,但是如果此时编译,则会报重定义的错,因为在test1.cpp中和main.cpp中都引用了test1.h,相当于定义了两次int stc_num。而此时并不会对test2.h中的a报错。这就是声明和定义的区别!

总结

不要在头文件定义变量,如果只是在同一个模块使用,而不被引用则不存在这个问题。

你可能感兴趣的:(C/C++,编程语言)