C++中的中的extern声明变量详解声明变量详解
extern声明变量无外乎如下两种:
1、声明全局变量
2、声明函数
今天我们只谈extern,什么const、static之类等等与之相关或不相关的一律忽略,下面就分别对以上两种情况一一讲解
声明和定义声明和定义
既然提到extern声明变量,那我们就必须搞清楚声明和定义的区别。
这里我们将普通数据变量和函数统称变量。从内存分配角度来说,声明和定义的区别在于声明一个变量不会分配内存,而定义
一个变量会分配内存。一个变量可以被声明多次,但是只能被定义一次。
基于以上前提,我们可以把声明和定义类比为指针和内存的关系。我们知道,指针其实就是指向内存的一个符号,变量的定义
就好比一块内存区域,而声明就好比它的指针,可以有多个指针指向同一个内存区域,而一个指针只能指向一个内存区域,这
样就很好理解为什么变量只能被定义一次,如果被定义多次,那就会分配多个内存,这样你通过变量的声明到底去找哪块内存
区域呢,这会是个问题。
对于数据来说,声明和定义往往是同时存在的,比如下面的一行语句
代码如下:
int data;
这样既声明了data同时也定义了data,怎样做到只声明而不定义呢,用extern就可以了
代码如下:
extern int data;
对于函数来说,声明和定义就很容易区分了,一般我们会将声明放在头文件而将定义放在源文件里
代码如下:
void hello();
这是一个函数的声明,而
代码如下:
void hello()
{
printf(“hello world!\n”);
}
这是一个函数的定义。当然,函数的声明和定义也可以同时发生,如果我们没有头文件而只有源文件,并且在源文件里并没有
void hello();这样的语句,那么这个函数的声明和定义就同时发生了,此时如果我们在原文件里想要调用函数hello(),你调用的
代码必须在函数定义之后。
其实上面的要点只在于一句话:使用变量之前必须声明,声明可以有多次,而定义只能有一次。记住这句话,后面的就都很容
易理解了。
extern声明全局变量声明全局变量
我们先来看如下例子,现有三个文件:test.h, test.cpp, main.cpp,其中main.cpp和test.cpp需要共享一个变量g_name,三个
文件的内容如下
代码如下:
/* test.h */
#ifndef _TEST_H_
#define _TEST_H_
#include <string>
std::string g_name;
void hello();
#endif
/* test.cpp */
#include <stdio.h>
#include “test.h”
void hello()
{
printf(“hello %s!”, g_name.c_str());
}
/* main.cpp */
评论0