社区
C++ 语言
帖子详情
问一个关于static和extern的问题
fancard
2004-12-06 09:46:05
看《C++对象模型》
第一章里面有个地方:
//不合法吗?是的。以下两个声明造成矛盾的存储空间
static int foo;
…
extern int foo;
我感觉自己的理解有点似懂非懂,其实就是不懂。
哪位能给分析一下吗?谢谢。
...全文
257
22
打赏
收藏
问一个关于static和extern的问题
看《C++对象模型》 第一章里面有个地方: //不合法吗?是的。以下两个声明造成矛盾的存储空间 static int foo; … extern int foo; 我感觉自己的理解有点似懂非懂,其实就是不懂。 哪位能给分析一下吗?谢谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
《c语言深度解析》第3、4章 存储类、生命周期、作用域、链接域,指针与函数
课程内容: 第3章: 存储类与auto、
static
、register关键字 指令、常量、变量的生命周期 变量与函数的作用域 链接域与
extern
、
static
关键字 声明的意义 第4章: 存储空间、符号、地址 一级指针与多级指针 野指针与段...
static
和
extern
的作用
问
题
:
static
和
extern
修饰变量和函数时有什么作用?请举例说明。
static
简单来说,
static
关键字有两个作用: 限制变量的作用域 设置变量的存储域 具体来说,在不同的使用场景有不同的表现。(函数名也是变量...
static
和
extern
详解
static
修饰全局变量:
一个
全局变量被
static
修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。⼀个函数在整个工程都可以使用,被
static
修饰后,只能在本文件内部使用,其他文件无法正常的链接...
static
和
extern
用法总结
在普通函数前加
static
,表明是局部函数,只是在当前源文件中有用,和局部函数相对的是全局函数(前面加
extern
就是全局函数,但一般省略),一般函数都是默认声明为全局函数的,并且省略
extern
。 以下面这个例子就...
c语言中的
static
和
extern
,C语言
extern
与
static
的用法,及
extern
“c"
C语言
extern
与
static
的用法,及
extern
"c "一、c语言
static
与
extern
的用法1.
static
和
extern
:大工程下我们会碰到很多源文件。文件a.c
static
int i; //只在a文件中用int j; //在工程里用
static
void init() //只在a...
C++ 语言
64,639
社区成员
250,578
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章