首页
社区
课程
招聘
[求助]!!!高分求助 VC++ 中怎样从同一工程的另一个文件中获取静态全局变量或静态函数,实现对其访问
发表于: 2007-4-5 22:28 8529

[求助]!!!高分求助 VC++ 中怎样从同一工程的另一个文件中获取静态全局变量或静态函数,实现对其访问

2007-4-5 22:28
8529
VC++问题求助

VC++ 中怎样从同一工程的另一个文件中获取静态全局变量或静态函数,实现对其访问

不可以这样的形式,通过在有静态变量或函数的文件中加入获取静态变量或函数的代码,也不可将静态属性static关键字去掉,使其具有全局属性,原则是不改动有静态变量或函数的文件的代码,而在另一文件实现对静态标识符的访问。

file1.c

static int s_Variabl;

unsignde long getStaticVarAddr(void)

{

   return &s_Variabl;

}

  
static int dosometing(void)

{

   return 0;

}

  
unsignde long getStaticFunAddr(void)

{

  return dosometing;

}

  
file2.c

typedef void *funPointer(void);

  
void fun(void)

{

int  *ipVariabl=NULL;

funPointer callback=NULL;

  ipVariabl= getStaticVarAddr();

  printf(“ %8x  \n”, *ipVariabl);

  callback= getStaticFunAddr();

  callback();

}

  
各位有没有好方法或好资料,麻烦帮忙跟我研究研究。一周内发邮件给我,这个东西我已经搞了四五天了,搞得很郁闷。     万分感谢!!!

我的邮件地址cao.jinguo@zte.com.cn

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 288
活跃值: (112)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
2
自己写编译器。。。。
2007-4-5 23:55
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
静态变量应该不在其OBJ/LIB文件中导出符号,
但实际的编译器(如VC)也会导出静态变量的符号,不过链接器会忽略掉以避免全局/静态变量重名.
所以只有自己写链接器才能做到.
2007-4-6 08:48
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
4
非要实现这样的功能也不是不可以,Custom Build,写一个程序去调用CL.exe,在编译前当然就可以做点想做的事,比如用lex&yacc写个脚本简单分析下语法,然后改改代码再编译,这样可以搞个自己喜欢的语法风格出来
2007-4-7 22:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
DonQuixote楼主,这方面我不是行家,能说详细些么?静态标识符的这个难题,我搞了很久了,都没搞出来,我现在很想快快把静态标识符的事情做出来。  还请楼主多多赐教!!! 万分感谢!!!
2007-4-8 13:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
DonQuixote楼主,这方面我不是行家,能说详细些么?静态标识符的这个难题,我搞了很久了,都没搞出来,我现在很想快快把静态标识符的事情做出来。还请楼主多多赐教!!!  万分感谢!!!
2007-4-8 13:48
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
7
我的意思就是
你非要在其他CPP里访问static变量,从语法角度看当然是不行的
但是你可以改变VC对这些语法的解释
比如,逆向一下VC改变它的编译流程,呵呵,当然这是几乎不可能的
或者,写一个CL.exe替换VC的CL.exe,IDE编译C++时就会调用你写的CL.exe
这样你就有机会在编译之前对原代码进行处理,即可修改static的语义解释
当然这么做比较粗暴,VC已经提供了一个优美的方案,就是Custom Build,允许你自己控制编译过程
你可以打开Project Settings看,点一个CPP,在General里选上Always use custom build step
这样旁边就会Custom Build标签页,在里面你可以自己设定用哪个程序来编译这个CPP
所以,可以写一个程序,首先复制此CPP到临时目录,然后修改,然后调用CL.exe来编译它
如此以来你可以对语法重新解释,配合lex&yacc完全可以实现你自己喜欢的语法风格
举个例子,C语法不支持二进制数的代码表示,但是可以写个程序分析这个CPP,把0b11001010改成0xCA,然后调用CL.exe编译,用yacc的话这不是什么困难的事,这样就可以在VC的基础上扩展自己喜欢的语法

不过我不清楚你是在何种情况下需要访问另一CPP的static变量,不知道这种方式是否合适?
此外以上纯属猜想,我并未实验过
2007-4-8 21:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
DonQuixote楼主,这还是改代码,估计不能解决问题。  万分感谢您的回复!!!!
2007-4-10 08:56
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
9
呃。。莫非你只能写一个CPP,其他的都不能碰?
如果只是针对某个特定情况的话,可以搜索进程空间,结合某些内存特征分析出来
2007-4-10 17:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
是的,原则是不能改有全局静态变量或函数的文件的源代码,而在另一文件中实现对全局静态变量或函数的访问。自己去钻VC++的链接器是怎么实现的,难度太大,几乎是不可能的,所以我一直都在找好方法,但到现在都没找到。

万分感谢您的回复!!!!
2007-4-10 18:32
0
雪    币: 3686
活跃值: (1036)
能力值: (RANK:760 )
在线值:
发帖
回帖
粉丝
11
是不是我理解错误还是怎么回事,我怎么觉得这个问题很简单呢?
在file2.c中#include "file1.c"
或者使用extern也可以啊
2007-4-10 23:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
如果又有file3 需要引用file1 中的变量或函数的符号怎么办呢?

另外改变执行文件的代码布局是不可取的, 静态符号引用,需要保持原有代码布局,这样对于其他文件的运行和测试才具有更好的确定性。 不知楼主有何好方法。

   万分感谢您的回复!!!
2007-4-11 15:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
原则是不能改原来文件的代码,把全局静态变量的链接属性static改为extern的话,那就不叫静态变量了。

   万分感谢您的回复!!!
2007-4-11 15:25
0
游客
登录 | 注册 方可回帖
返回
//