C++extern全局变量
@2018-11-15
用C++编写多文件时一直有个疑惑, 就是多个文件能否在一个头文件当中声明全局变量, 然后其他文件可以一起用. 但是以前没有研究过, 这样子做总会出错, 今天来总结一下.
声明与定义:
对变量来讲, 一般情况两者是没有区别的, 声明就是让编译器知道有这个东西存在, 别让它给你在编译时报错, 定义是给这个东西分配特定的内存空间.
官方解释:
声明一个变量只是将变量名标识符的有关信息告诉编译器,使编译器“认识”该标识符,但声明不一定引起内存的分配。而定义变量意味着给变量分配内存空间,用于存放对应类型的数据,变量名就是对相应的内存单元的命名。
在C++程序中,大多数情况下变量声明也就是变量定义,声明变量的同时也就完成了变量的定义,只有声明外部变量时例外。
今天我们要说的就是上面的外部变量, 也就是多文件下共同使用的变量.
我们引入extern的概念.
声明变量:
extern int i;
定义变量:
int i = 1;
假设我们现在一个头文件, 两个cpp文件, 分别是"hello.hpp", “hello.cpp”, “main.cpp”.
//hello.hpp
#ifndef _HELLO_HPP
#define _HELLO_HPP
extern int test;
#endif
//hello.cpp
#include"hello.hpp"
int test = 5;
//main.cpp
#include<iostream>
#include"hello.hpp"
//extern int test;
int main()
{
std::cout << test << std::endl;
return 0;
}
hello.hpp头文件中extern声明了一个变量test, hello.cpp源文件中定义了这个变量, 给它分配了内存空间, main.cpp中没有声明(注释掉了)直接调用变量test, 两个源文件都include了hello.hpp.
大家猜测一下这种会不会报错?
根据测试, 在ubuntu g++编译和windows visual studio 编译下不会报错, 在Dev C++上面报错了(谜之错误), 反正我现在也不用Dev C++, 这个错误也没必要深究, 总之, 上面这段代码是正确的, 不管main.cpp中有没有注释掉extern int test; 这段代码都是可以编译并且运行的, 也就是说, 如果我们以后要使用多文件共享几个全局变量, 就可以仿照上面, 在头文件中extern声明一个变量, 然后在其中一个cpp中定义, 分配给它内存, 其他的cpp中为了程序的可读性, 最好还是加上extern声明.(要不然不知道变量从哪里蹦出来的)
归根到底, 还是变量的重定义问题, 变量只能定义一次, 但是可以声明多次, 多次定义的话就会出错, 我们在编写多文件时一定要注意这点.