1 声明(用于向程序表明变量的类型和名字。在程序中,变量可以有多个声明。多次声明。文件重复引用也算作多次声明)
1.1声明全局变量(头文件中只能声明,不能定义)
extern 【type】paramName;//声明
例如 extern int a;//声明(在cpp中定义的时候,int a = 0,注意前边的int要有,不能直接 a = 0 )
如果这样写: int a;算定义。
extern int a =10;算作定义;
总结: 不能在头文件中定义变量,因为非常容易造成重定义问题。即便你的头文件只被其他文件包含一次,也会有重定义问题
转载来自:http://cxd2014.github.io/2016/05/11/global-variable/
在头文件中定义全局变量时前面加上关键字static,此时编译会通过但是此时全局变量的作用域不是我们想要的结果! 测试: /* 在头文件中定义一个全局变量 */ static int a = 0; /* 然后在两个包含了此头文件的C文件中分别打印这个变量的地址 */ printf("&a = %x ", (uint)&a); 测试结果你会发现 两个(cpp打印的同一个变量的)地址不一样 !!原因是它在每个源文件中都有一份这个变量的拷贝,而不是共用一个变量。它的作用域只在一个源文件中,而不是我们想要的跨文件的全局变量。
1.2声明类变量
class A{
int arr;//声明
int arr1 =1;//声明
static int arr3;//声明,未分配内存
static int arr4 = 0;//vs2010报错,“只有 静态 常量 整形数据成员才可以在类中初始化”
const static int arr5 = 0;声明,并且初始化(定义)。而且必须在这里初始化,不能把常量类型的声明和初始化分开。
}
1.3 (转载知识点 from Modnar)
如果一个类内成员变量是static的,且需要将之设定为常量(const),那么这个变量声明与初始化均可写在头文件内。需要注意的是,不能在头文件内声明const static成员变量,而在具体源cpp文件内实现其初始化。因为这样编译器需要根据具体的实现文件来确定该成员变量的初始值(static const),若实际应用中没有相应的实现文件(源cpp文件)来对这个成员变量实现初始化,则编译器无法明确意图,从而无法完成编译。
如果一个类内成员变量是static的,但不需要将其设定为常量(const),那么这个变量声明于头文件内,初始化(定义/实现)写在对应的cpp源文件中。
1.4 头文件在被多个源文件包含的时候
1.4.1
#ifndef
#define //防止宏的重定义,防指文件的重复包含
//头文件的声明内容(注意是声明,不能有任何定义相关的东西,const除外)
//注意,这三句宏定义,只能处理头文件重复包含问题,解决不掉头文件中因为有变量或者函数的定义,而产生的重定义问题。
#endif
1.4.2 另外,如果头文件中存在定义语句,并且被多次包含,#program once(保证只编译一次)也解决不了重定义问题。各种obj中间产物,还是会报重定义问题
#pragma once预编译指令防止重复编译是针对某一个源文件而言的,即某个源文件包含了两个头文件,而那两个头文件之一又包含了另一个,此时 #pragma once会发生作用,起到只编译一次的作用。
全局变量不要定义在头文件中,多个源文件(.cpp)同时包含某一个头文件,那个头文件又定义了一个全局变量。此时会发生链接错误(链接过程中,变量的ID重复),解决方法是使用extern。
例如:test1.cpp和test.cpp两个源文件都包含了test1.h。test1.h中定义了变量a, 因此int a = 0;会被编译器展开到那两个源文件中,因此,也会生成两个符号。在链接的过程中,这两个符号重复了,所以就报错了
相关文档:https://blog.csdn.net/qq_37966125/article/details/105793236