外部变量与静态外部变量

ruihouwei 2004-04-01 10:03:08
静态外部变量:只能用于本文件的外部变量

可是对于这种情况:
头文件:
//:test.h -- heddfile
static int i = 1;

程序:
//:test.c
#include <stdio.h>
#include "test.c"

void main(void) {
printf("%d\n",i);
}

按照静态外部变量只能作用于本文件的说法,i是不能作用于test.c的,对不对?
可是以上的程序是对的,说明i作用于test.c了,为什么?
是不是我的理解有什么问题,望各位高手赐教!谢谢:)
...全文
421 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
password318 2004-04-01
  • 打赏
  • 举报
回复
最后一行应该是
......
include是文件包含,把其他文件包含到当前文件中,是不具有变量声明或定义功能!与前面的不要搞起来!
password318 2004-04-01
  • 打赏
  • 举报
回复
我知道你得问题了.
用include 把其他文件包含进来,就等同于一个文件了!而外部变量可以被那些不包含定义该外部变量的文件但属于同个项目中的其他文件所使用,此时不用include,只要在使用前先声明(extern)就行了.
总结:区别就是外部变量作用域可以跨文件使用,而static 外部变量限定为只有本文件使用!
include是文件包含,把其他文件包含到当前文件中,不是不具有变量声明或定义功能!
pwk 2004-04-01
  • 打赏
  • 举报
回复
是对于.c来讲的,你那两句是谁说的?不要只看死书,自己要多考虑
ruihouwei 2004-04-01
  • 打赏
  • 举报
回复
如果将extern int j;省略掉,程序还是可以运行的
结果是:
1
1

据我所知:
静态外部变量和外部变量的存储方式是一样的,都是存储在静态存储区
只是作用域不同啊!

其实我想知道的是:
静态外部变量只能作用于本文件
外部变量可以作用于多个文件
这两句话的具体含义!

Greaitm(夜草) 说:a.c里面的是静态外部变量的话,b.c里面的声明是无效的
能不能给个错误使用静态外部变量的例子?:)
linxy2002 2004-04-01
  • 打赏
  • 举报
回复
//:test.h -- heddfile
static int i = 1; 静态变量
//:test1.h -- heddfile
int j = 1;

程序:
//:test.c
#include <stdio.h>
#include "test.c"
extern int j; //外部变量
void main(void) {
printf("%d\n%d\n",i,j);
}
静态变量和一般的变量的区别在于:
静态变量在程序运行前就已经存在了,它存放在数据段
ruihouwei 2004-04-01
  • 打赏
  • 举报
回复
能不能给个具体的程序做为例子!
Greaitm 2004-04-01
  • 打赏
  • 举报
回复
静态外部变量一般使用在 *.c/*.cpp 里面比较有效,譬如
在a.c文件里声明了变量int t,那么在b.c里声明extern int t,将引用a.c里面的t。
但如果a.c里面的是静态外部变量的话,b.c里面的声明是无效的
ruihouwei 2004-04-01
  • 打赏
  • 举报
回复
静态外部变量只能作用于本文件
外部变量可以作用于多个文件

这两句话的具体含义是什么啊?谁能给个具体的实例?谢谢!
ruihouwei 2004-04-01
  • 打赏
  • 举报
回复
头文件中定义的普通外部变量要被其它文件使用同样也要被include啊!
那外部变量和静态外部变量的区别到底在哪里?
ljstorm 2004-04-01
  • 打赏
  • 举报
回复
静态外部变量也可用于include该文件的文件!
ljstorm 2004-04-01
  • 打赏
  • 举报
回复
你是不是include "test.h"了?
如果include了那个头文件就可以用了
sharkhuang 2004-04-01
  • 打赏
  • 举报
回复
include 就是就得展开!和你在这文件里面写一次一摸一样
w3guy 2004-04-01
  • 打赏
  • 举报
回复
静态外部变量只能作用于本文件的说法是正确的,当编译器处理#include <xxx>时相当于把文件xxx的内容 替换#include <xxx> 所在的位置。
静态外部变量 和全局变量的区别是:
1、静态外部变量只能作用于本文件,每个文件都可以有相同名字的静态变量而且互相独立。
2、全局变量作用于整个程序, 整个程序只能有一个相同名字的全局变量。

举个例子解释1:
//test.h
static int i = 0;

//test1.cpp
#include "test.h"
void inc() { i++; }

//test2.cpp
#include "test.h"
void inc(); //声明一下 inc 以便调用

void main()
{
i++;
inc();
printf("%d\n",i);
}

结果是什么? 2? 错了,结果是1,因为 test1.cpp 的i++ 和test2.cpp 的i++ 实际上操作的是不同的变量。

如果,把i 改成全局变量(去掉i 前面的 static), 结果是什么?结果是编译通过,但链接不通过,会报multiple definition of `i'.

把test1.cpp test2.cpp 改为以下,就可通过。

//test3.cpp
int i = 0; // 定义全局变量
void inc() { i++; }

//test2.cpp
extern int i; // 声明全局变量
void inc(); //声明一下 inc 以便调用

void main()
{
i++;
inc();
printf("%d\n",i);
}

这次程序结果是 2.

extern 只是声明一个全局变量,并没有分配内存。一个程序只能在一个文件里对一个全局变量定义一次,其他文件要用它,必须用extern 声明。
ruihouwei 2004-04-01
  • 打赏
  • 举报
回复
明白了,谢谢各位热心的大哥!
我的问题在于没有理解头文件的作用!
正如 password318(MJ)所说:

外部变量可以被那些不包含定义该外部变量的文件但属于同个项目中的其他文件所使用,此时不用include,只要在使用前先声明(extern)就行了

64,647

社区成员

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

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