请问static 和 extern 的区别

zj_zyq 2002-02-25 05:51:57

请问static 和 extern 的区别



//example.h
int a;
extern int b;

////
Ctrl F5;

Error Link ... example.obj; why

static int c;

void AA()
{
c++;
cout<<c;
}
void main
{
AA();
c++;
cout<<c;
}

output
11 Why
...全文
382 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zj_zyq 2002-02-27
  • 打赏
  • 举报
回复
在《MFC深入浅出》中
//mfc.h

//mfc.cpp
extern CWinApp theapp;

//my.h

//my.cpp
CWinApp theapp;
void main()
{
CWinApp* APP=GetApp();
...
}
}

1\
extern CWinApp theapp;//为什么不放在 mfc.h中声明

2、
CWinApp theapp;//难道不是重复声明吗,或有其他含义吗
zj_zyq 2002-02-27
  • 打赏
  • 举报
回复
1、
// wnd.h
int a;
extern int b;
static c;
会出现Errof Link *.obj Why; 针对int a; extern int b;出错

// wnd.cpp
LERESULT CALLBACK WndProc(...)
{
...
case WM_PAINT:
c=1;
return 0;
...
}
///////////////
2、
//myprogram.h
#include *.h

//myprogram.cpp
bool CALLBACK DlgProc(...)
{
...
case WM_PAINT:
output(c);//输出C
return 0;
...
}

结果有时是1,有时是0,Why
sdmity 2002-02-27
  • 打赏
  • 举报
回复
extern CWinApp theapp 不是变量定义,CWinApp theapp才是,它只是在这个文件(mfc.cpp)中对在别的文件中定义的变量(my.cpp)的引用,不放在mfc.h中是因为并不是所有用到mfc.h的文件都需要这个变量。所以,CWinApp theapp不是重复声明。
Last_Dodo 2002-02-26
  • 打赏
  • 举报
回复
extern只能用来修饰变量/函数的声明(declaration)。它的意思是:变量/函数已经定义,我要用它。此变量/函数可以是别的模块(module)定义的,也可以是当前模块定义的。它修饰的变量不一定是全局变量但若是别的模块定义的,它必定是全局变量而且不是静态(static)全局变量。若修饰的是函数,当前文件内不能有同名函数(有些编译器允许有同名函数但它必须是静态即static而且extern指的总是这静态函数)。
下面的例子可帮助理解:
In a.C:
#include <iostream.h>
int i = 100;
void foo()
{
cerr << "In a.C foo()\n";
}
In main.C:
#include <iostream.h>
extern int i;
void test()
{
cerr << i << endl; //i自然是100
extern void foo();
foo(); //哪个foo()?
}

static void foo() //有些编译器允许
{
cerr << "In b.C foo()\n";
}
int main()
{
int i = 0;
extern int i;
cerr << i << endl; //哪个i?
{
extern int i;
cerr << i << endl; //现在又是哪个i?
}
test();
extern void foo();
foo(); //哪个foo?
}

static修饰变量时,既可以修饰变量的定义(definition)也可以修饰变量的声明。
static int i; //如果是在类里,修饰的是声明。如果是在类外修饰的是定义。
static还可以用来修饰函数的声明或定义。
static void foo(); //修饰的是函数声明。
static void foo() //修饰的是函数定义
{
...
}
它的意思是:
1。如果在类里,修饰的变量/函数是类变量/函数。
2。如果在类外,修饰的变量/函数可见范围(scope)是整个文件内部,即其它模块是不能通过extern来调用它。
masterjames 2002-02-26
  • 打赏
  • 举报
回复
一个是静态,一个是全局,
静态应该用静态函数来访问。
全局都可以访问
zheng_can 2002-02-25
  • 打赏
  • 举报
回复
就你的程序来讲
在声明好 static int c 后,应该给它赋以初值(0),否则打印出任何数都是有可能的
zosatapo 2002-02-25
  • 打赏
  • 举报
回复
基本同意: hezh() 的观点。
static和extern都被称为"global"变量(或者函数)。
但是他们的生存周期和可见性是不同。static是文件级,
只有程序文件之间显式的包含才可以引用(主要就是使用#include)
但是extern是程序级的,你不必显式的引用文件的,但需要使用extern
存储空间修饰符,这个任务编译器,链接器帮你完成了。

可以参考一下下面的文章。
http://www.csdn.net/Develop/read_article.asp?id=12545
http://www.csdn.net/Develop/read_article.asp?id=12539
Witty 2002-02-25
  • 打赏
  • 举报
回复
static 声明需要初始化?

结合你的要求,给你一个例子
// TEST.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "h.h"
#include "iostream.h"

static int c;
extern int h;
void AA()
{
c++;
cout<<c;
}

int main(int argc, char* argv[])
{
AA();
c++;
cout<<c<<endl;
cout<<h<<endl;
return 0;
}
/*
* h.h
*/
int h ;

///////////
output:
12
0
//////////
对变量而言,static声明或定义一个静态变量
而extern 是引用已经声明的变量
wolfboy 2002-02-25
  • 打赏
  • 举报
回复
哦,说错了,对变量而言,static将声明或定义一个静态变量
extem外部声明或定义
wolfboy 2002-02-25
  • 打赏
  • 举报
回复
对函数而言,static将函数申明为局部函数,
对变量而言,则相反
Behard 2002-02-25
  • 打赏
  • 举报
回复
static:在程序的数据区
extern:是在不同的*.c/*.cpp 文件中的,只能定义一次,别的只是引用
hezh 2002-02-25
  • 打赏
  • 举报
回复
static 是文件级的,必须初始化,extem外部声明或定义!两个不同的概念
garfield_82 2002-02-25
  • 打赏
  • 举报
回复
我记得,static的作用域是整个文件范围,extern是多个文件之间。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧