个人笔记--extern和static 区分

extern 关键字声明变量或者函数为外部变量或函数。表示变量或者函数体在外部文件被定义。编译器遇到此申明会到其他模块中寻找改函数体或变量。
static 申明变量或函数为静态;静态的函数或者变量使该变量或者函数只能作用于本文件。通俗点讲就是,只能是本文件内部使用,其他文件哪怕是定义一个相同的都与我无关,编译器也不会报错。这也是其好处;未经初始化的静态变量初值都为0;静态变量都再全局数据区存储;包括静态全局变量,静态局部变量;
在内存中的分布情况如下:   代码区 //low address
  全局数据区

  堆区

  栈区 //high address
  一般程序把新产生的动态数据 存放在堆区,函数内部的自动变量 存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静 态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。
静态局部变量有以下特点:  
该变量在全局数据区分配内存;
 
静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的
函数调用不再进行初始化;
静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0; 

静态函数: 

在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。   

对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷 贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共 用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新。静态的类数据成员分配在全局区,哪怕是该类没有实例化一个对象,我们都可以访问它;静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;非静态成员函数可以任意地访问静态成员函数和静态数据成员;静态成员函数不能访问非静态成员函数和非静态数据成员;

eg:1.cpp中定义char a;如果想在2.cpp中使用,那么2,cpp中使用时,这么用extern char a;
如果定义char a[5];定义一个数组,在 2.cpp中要要使用该数字,那么必须这么声明 extern char a[]; 如果是申明为extern char *a;会出错,原因是extern char *a,只告诉编译器有一个外部的指向字符串的指针。声明可以多次使用,可以在多个文件中使用。int a ,与extern int a ,一个是定义一个变量,一个是申明一个变量,大爷的。细节啊;全部交给大学老师了.......汗
  在一个文件中定义一个函数,声明为外部extern

eg: 1.cpp中定义如下函数:

#include "stdafx.h"
#include"iostream"
using namespace std;
//extern static my aa;
//extern static my bb;  //如果申明为static 则有错误;
extern  my aa;   // 在2.cpp中定义的全局变量
extern  my bb;   //
void fun()
{
 cout<<"test static aa:"<<aa.a<<endl;
 cout<<"test static aa:"<<aa.b<<endl;
 cout<<"test static aa:"<<bb.a<<endl;
 cout<<"test static aa:"<<bb.a<<endl;
}

在2.cpp中定义了

#pragma once
#include "stdafx.h"
#include"iostream"
using namespace std;
my aa,bb;  // 定义两个全局自定义的结构体。在stdafx,h中
//static my aa,bb; //如果是静态的,则,fun()函数里的变量永远都是0,不会随2.cpp赋值而改变;
extern int temp1;
extern void fun();

int _tmain(int argc, _TCHAR* argv[])
{
  bb.a =1;
 bb.b =1;
 aa.a =0;
 aa.b=0;
 cout<<aa.a <<" "<<aa.b <<endl;
 cout<<bb.a <<" "<<bb.b <<endl;
 cout<<temp1<<endl;
 fun();
 system("pause");  
 return 0;
}

输出的结果如人所愿。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值