打印

,怎么访问别的不同源文件里的 变量?

[复制链接]
2970|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
老郑电子|  楼主 | 2011-1-27 20:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
nevsayno| | 2011-1-28 08:49 | 只看该作者
用extern声明一下呀  建议楼主再仔细看看C教材

使用特权

评论回复
板凳
yewuyi| | 2011-1-28 08:57 | 只看该作者
比如,      
aa.c   里面定义了一个外部变量:temp
而bb.c 里面的函数想引用这个temp变量。。

这时,这个temp变量应该定义呢?
aa.h和bb.h  应该怎么写呢? ...
老郑电子 发表于 2011-1-27 20:46


你的理解错误,在aa.c里面只能申明外部变量,不能定义外部变量,这两个概念差别极大。

如果说,你是想在bb.c中使用aa.c内定义的变量temp,则举例如下:
//aa.c
int temp=0;
void  xx(void)
{
temp=5;
}
//bb.c
extern  int  temp;
void  yy(void)
{
temp++;
}
至于aa.h和bb.h怎么写?
一般定义下在C文件中,声明写在H文件中,根据这个原则,你可否明白应该怎么写H文件?

使用特权

评论回复
地板
老郑电子|  楼主 | 2011-1-28 10:41 | 只看该作者
你的理解错误,在aa.c里面只能申明外部变量,不能定义外部变量,这两个概念差别极大。

如果说,你是想在bb.c中使用aa.c内定义的变量temp,则举例如下:
//aa.c
int temp=0;
void  xx(void)
{
temp=5;
}
//bb.c
ext ...
yewuyi 发表于 2011-1-28 08:57


//aa.c中定义的外部变量temp;那么变量temp就该设置为这个aa.c的外部接口。
aa.h中是否这样写?

#ifndef  _AA_H_
#define _AA_H_

extern int temp;  //声明变量temp为外部变量

#endif

然后,再让 bb.c中包含#include "aa.h"

是否应该这样写?

使用特权

评论回复
5
yewuyi| | 2011-1-28 10:51 | 只看该作者
//aa.c中定义的外部变量temp;那么变量temp就该设置为这个aa.c的外部接口。
aa.h中是否这样写?

#ifndef  _AA_H_
#define _AA_H_

extern int temp;  //声明变量temp为外部变量

#endif

然后,再让 bb.c中包含#in ...
老郑电子 发表于 2011-1-28 10:41


错。

使用特权

评论回复
6
老郑电子|  楼主 | 2011-1-28 10:53 | 只看该作者
那应该怎么写呢?

使用特权

评论回复
7
yewuyi| | 2011-1-28 10:53 | 只看该作者
尽量按照以下规格:
在aa.c中包含aa.h
在bb.c中包含bb.h
可以在aa.c或者bb.c中包含一个共用头文件,一般命名为comm.h等名字。

请使用多文件编译等关键字在百度中搜索

使用特权

评论回复
8
nevsayno| | 2011-1-28 10:58 | 只看该作者
4L这样子写是可以的,但是我不会这么用,因为这样不能正确的描述各模块之间的依赖关系。

使用特权

评论回复
9
yewuyi| | 2011-1-28 11:02 | 只看该作者
各模块之间的关系尽量通过函数的调用来体现,尽量别通过包含的方式体现,否则,还不如把两个模块相关的代码写到一个文件中方便。

各模块能做到互相独立那简直就是太好了。。。。。。

使用特权

评论回复
10
李冬发| | 2011-1-28 11:52 | 只看该作者
叫全局变量。
另一个文件里用extern声明一下,别处有定义。

使用特权

评论回复
11
李冬发| | 2011-1-28 11:54 | 只看该作者
如果要引用另一个程序里的变量,难度就大了。
DLL里的还要办。
exe里的太难了,但不是做不到。

使用特权

评论回复
12
nevsayno| | 2011-1-28 12:00 | 只看该作者
不同意楼上的观点,理论上要访问另外一个EXE的变量是做不到的,最起码系统的设计者是不允许两个EXE之间的变量能互相访问的到的。当然,若是系统设计存在漏洞,那就给黑客行为留下了攻击的入口。

使用特权

评论回复
13
diweo| | 2011-1-28 18:17 | 只看该作者
本帖最后由 diweo 于 2011-1-28 18:18 编辑

看来我也的仔细学习一下extern。

楼主的问题我也遇到,我用的是笨办法(有点类似于OO中私有变量和成员函数)
比如我a.c里面有个变量int a,我再定义一个函数int get_a(void),然后return a就行了。
在别的文件里不能直接访问a,但是调用get_a()是可以的,也就是间接的得到了变量a。

类似的还可以定义一个函数set_a()。

使用特权

评论回复
14
nevsayno| | 2011-1-28 19:02 | 只看该作者
呵呵 OO的思想还是不要用来写面向过程的程序 要不然看着别扭

使用特权

评论回复
15
李冬发| | 2011-1-29 02:29 | 只看该作者
不同意楼上的观点,理论上要访问另外一个EXE的变量是做不到的,最起码系统的设计者是不允许两个EXE之间的变量能互相访问的到的。当然,若是系统设计存在漏洞,那就给黑客行为留下了攻击的入口。 ...
nevsayno 发表于 2011-1-28 12:00

没有做不到的东西!

使用特权

评论回复
16
yewuyi| | 2011-1-29 08:55 | 只看该作者
看来我也的仔细学习一下extern。

楼主的问题我也遇到,我用的是笨办法(有点类似于OO中私有变量和成员函数)
比如我a.c里面有个变量int a,我再定义一个函数int get_a(void),然后return a就行了。
在别的文件里不能 ...
diweo 发表于 2011-1-28 18:17


通过return只是得到了这个变量值,这不能叫着完全的访问,和使用extern还是有区别的。

使用特权

评论回复
17
nevsayno| | 2011-1-29 10:04 | 只看该作者
没有做不到的东西!
李冬发 发表于 2011-1-29 02:29

那我对这个问题倒是很感兴趣,请李老师指点一下~

使用特权

评论回复
18
李冬发| | 2011-1-29 13:31 | 只看该作者
2个可执行文件间的变量共享看拟没法实现,其实执行文件与系统文件之间的数据交换就是一个例子。
在实模式下就不用讲了,参看吴小军的做法。
在保护模式下就比较难了。首先你得有特权级别。让2个变量的物理内存重叠。

使用特权

评论回复
19
nevsayno| | 2011-1-29 18:13 | 只看该作者
李老师 可能我们的前提不一样 我说的是处于非root用户的两个应用程序之间的变量互访 并且这个操作由自己完成 这个是做不到的
您在18楼说的特权级别显然和我的前提不一样
在特权级别下运行的代码还有什么是做不到的么

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

56

帖子

1

粉丝