问一个关于static和extern的问题

fancard 2004-12-06 09:46:05
看《C++对象模型》
第一章里面有个地方:

//不合法吗?是的。以下两个声明造成矛盾的存储空间
static int foo;

extern int foo;

我感觉自己的理解有点似懂非懂,其实就是不懂。
哪位能给分析一下吗?谢谢。
...全文
257 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
y_cc 2004-12-06
  • 打赏
  • 举报
回复
载至 csdn.net


extern
l 声明变量或函数为外部链接,即该变量或函数名在其它文件中可见。被其修饰的变量(外部变量)是静态分配空间的,即程序开始时分配,结束时释放。用其声明的变量或函数应该在别的文件或同一文件的其它地方定义(实现)。在文件内声明一个变量或函数默认为可被外部使用。

l 在C++中,还可用来指定使用另一语言进行链接,这时需要与特定的转换符一起使用。目前Microsoft C/C++仅支持”C”转换标记,来支持C编译器链接。使用这种情况有两种形式:

u extern “C” 声明语句

u extern “C” { 声明语句块 }



差不多就是这样了
248406869 2004-12-06
  • 打赏
  • 举报
回复
extern int foo; //声明
... //使用foo
static int foo;

这样当然没有问题了。
Flood1984 2004-12-06
  • 打赏
  • 举报
回复
无论是static 还是全局变量,都是在程序的main开始执行前已经分配了内存,
所以你的“不想提前定义它(也许是因为不想先给它分配内存空间),”不能实现
fancard 2004-12-06
  • 打赏
  • 举报
回复
看到各位的讨论
我还想问:假如我这样用foo呢?
我需要把foo当成一个static的变量,但是不想提前定义它(也许是因为不想先给它分配内存空间),
所以先声明,后定义:
extern int foo; //声明
... //使用foo
static int foo;
这样可以吗?
这样设计也许不太好。设计有什么问题吗?语法上有没有问题?欢迎大家讨论。
fancard 2004-12-06
  • 打赏
  • 举报
回复
不好意思,简写了。
前面提到的《C++对象模型》指的是《Inside The C++ Object Model》,Stanley B.Lippman写的。
我看的是侯捷的翻译版。
shisan107 2004-12-06
  • 打赏
  • 举报
回复
同意 yevv(十年磨杵)和 muzhi(木子)。
static int foo;
...
extern int foo;
这样就是自相矛盾的。想用来达到什么目的呢?


friedchicken2002 2004-12-06
  • 打赏
  • 举报
回复
extern 定义的变量是用来引用在其他文件中定义的变量

在my.h中定义
int i;
在my.cpp中
#include my.h
...
extern int i ;//就可以实现对my.h中的i的使用,并且,编译器不会给这个i分配空间

而static int i 只是一个静态的变量,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
248406869 2004-12-06
  • 打赏
  • 举报
回复
请问楼主《C++对象模型》的作者是谁?
021850524 2004-12-06
  • 打赏
  • 举报
回复
static int i;//说明i是个整数,作用在这个文件中,出了这个文件i就不存在了.并为它分配存储空间.
extern int i;//说明i是个整数,是在别的文件中定义的,即不要在这个文件中再为i分配存储空间.
这两句放在一起可不矛盾了吗.一个要分配,一个不让分配.
fancard 2004-12-06
  • 打赏
  • 举报
回复
/*
《C++Primer》第8章331页:
关键字extern 为声明但不定义一个对象提供了一种方法,实际上它类似于函数声明,承诺了该对象会在其他地方被定义,或者在此文本文件中的其他地方,或者在程序的其他文本文件中。例如
extern int i;
对程序来说是一个保证,表示在其他某个地方存在一个如下所示的定义
int i;
extern 声明不会引起内存被分配,它可以在同一文件中或同一程序的不同文件中出现多
次。
*/
to:影子传说
那么就是说extern只是表示声明这里(声明点)可以用吧?还表示它在别的地方也可以用吗?在本文件外可用?
to:木子
按上面的这一段话,似乎extern int foo不能说明foo在其它文件中定义

muzhi 2004-12-06
  • 打赏
  • 举报
回复
C++的基础书拿出来看看吧,关于作用域哪本书中都会有
pacman2000 2004-12-06
  • 打赏
  • 举报
回复
static是本文件内使用,extern说明可以在文件外使用。因此两个是矛盾的。
muzhi 2004-12-06
  • 打赏
  • 举报
回复
楼上的如果在一个文件中那会更矛盾的
static int foo说明在本文件中定义
而extern int foo说明foo在其它文件中定义
muzhi 2004-12-06
  • 打赏
  • 举报
回复
支持 yevv(十年磨杵)
我的看法与其相同,static说明foo只能在本文件中使用
extern int foo说明在另一个或多个文件中要用到foo这个变量
这样做是矛盾的
fancard 2004-12-06
  • 打赏
  • 举报
回复
回复人: yevv(十年磨杵) ( ) 信誉:100 2004-12-06 09:56:00 得分: 0

static int foo;说明foo只能在本文件中使用(static的含义之一)

extern int foo;说明foo可以在全局使用

---如果这两行代码在同一个文件里呢?
---extern不是是一个声明吗?
声明有那么一个地方(前面?)定义了这个变量foo.
248406869 2004-12-06
  • 打赏
  • 举报
回复
static int foo;变量定义,并说明变量在本文件中可以使用。
extern int foo;变量声明,说明这个变量在别的地方定义。
好像并不冲突。
kobefly 2004-12-06
  • 打赏
  • 举报
回复
static int foo;
这里不止声明

还要分配存储空间的
yevv 2004-12-06
  • 打赏
  • 举报
回复
static int foo;说明foo只能在本文件中使用(static的含义之一)

extern int foo;说明foo可以在全局使用
seabreeze9802 2004-12-06
  • 打赏
  • 举报
回复
我的理解是:这两者都是用来声明一个名为foo的全局变量,当然会造成冲突
micemice 2004-12-06
  • 打赏
  • 举报
回复
MARK
加载更多回复(2)

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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