全局变量可以在不同层(不同工程)之间使用吗? 回调函数呢?

blackpool 2007-07-04 10:50:16
全局变量可以在不同层(不同工程)之间使用吗? 回调函数呢?



请教一个问题,不知道能不能实现:

我把问题抽象化,给大家讲讲:

1. 现在有一个比较复杂的程序,包括三个部分:
a. 最底层调用了CppUnit 库进行测试
b. 然后上面封装了一层UI, 做了一个用户界面,可以使用此界面控制底层的测试
以及输出测试报告
c. 最上面编写了测试用例,编译后可以被加载到图形界面工具中,进行测试

2. 现在的问题是需要在最后的报告中输出一段字符串,解释整个测试的目的及详细
信息。这段字符串是在测试用例的头文件中声明定义的。无法修改 c. 测试用例部
分的代码,因为这部分的API定下来了(原来有许多测试用例已经这么写了,无法
改动这上千个测试用例部分的代码)

3. 我的想法是在CppUnit最底层的地方某个宏定义中记录下输出的字符串。因为每次
要输出信息时测试用例头文件里就要调用此宏来输出信息。

问题是:有没有这么定义全局变量的? 在最底层定义一个全局变量来存储字符串,
在UI生成报告时加上存储的字符串,然后输出到报告?

或者有什么别的方法,比如回调函数等等。哪里可以找到回调函数的示例呢?想参考
一下,网上关于回调函数众说纷纭,请大家帮忙!


/// a. 最底层宏定义,输出std::string anStr(info); 的字符串
#define BEGIN_PRINTDOC \
private: \
static void print_doc() \
{


////////////////////////////////////////////////////////////////////////
#define PRINTDOC(info){ \
std::string anStr(info); \
CPPUNIT::MyListener::myInstance()->addInfo( "PRINTDOC", anStr.c_str()); \
}
////////////////////////////////////////////////////////////////////////
#define END_PRINTDOC \
} \
public:


/// c. 测试用例头文件中,用到上面的宏,却无法输出信息,因为此时还没有注册CppUnit
/// 的测试。注册CppUnit的测试在测试用例的cpp文件里,不在头文件中。
/// 如果把以下宏加到.cpp文件中输出信息就一点问题都没有,可是此测试用例头文件又
/// 不能改动!
class SampleTestCase : public CPPUNIT::TestFixture
{

BEGIN_PRINTDOC
PRINTDOC("doucumentation infomation");
END_PRINTDOC

.......................
}
...全文
1172 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
dxcnjupt 2007-07-06
  • 打赏
  • 举报
回复
没有考虑DLL的情况。。。。确实是一个进程的

试一下在DLL里面定义全局变量,然后引出这个变量,再让EXE使用。

测试的话,写一个基本空白的EXE和DLL,定义变量--调用函数异地赋值--本地显示
blackpool 2007-07-05
  • 打赏
  • 举报
回复
谢谢fflush大哥! 我也想过做一些简单的测试,但是不知道怎么去测试这个全局变量
在程序中打断点好像行不通,怎么样才能跟踪到这个全局变量呢?

请大伙指导: )
fflush 2007-07-05
  • 打赏
  • 举报
回复
我是在vc环境下编译的,生成了一个.exe为用户界面程序和一个.dll为单元测试
.exe加载.dll进行测试
-----------------------------------------------------
由于你的exe加载了一个dll进行测试,这个dll实际上被加载到了exe所在进程的地址空间中,与exe位于同一个进程中。并不是说你在vc里有两个工程,就意味着两个进程,这是两个层面上的事情。

我也做过全局变量的测试,虽然编译没有问题,但是还是没有得到正确的结果,所以我认为对于这个多进程的程序而言,不可能用全局变量 (对吗?)
-----------------------------------------------------
你的问题估计处在别的什么地方,你可以做一些简单的测试,确保使用全局变量是可以共享信息的,然后再回到你自己的问题上来。

blackpool 2007-07-05
  • 打赏
  • 举报
回复
多谢大家关心,昨天我搞清楚了几个问题,至少是努力去搞清楚了几个问题。

首先,我的UI程序是单进程,多线程的。

但是看了大家的回帖 还是又有了疑问:

我是在vc环境下编译的,生成了一个.exe为用户界面程序和一个.dll为单元测试

.exe加载.dll进行测试

所以我认为就这两个工程来说是不同进程的,不知道对不对,(如dxcnjupt所讲,也应该是不同进程)

我也做过全局变量的测试,虽然编译没有问题,但是还是没有得到正确的结果,所以我认为对于这个多进程的程序而言,不可能用全局变量 (对吗?)

进程间通讯有哪些方法呢?“内存影射的方法 也可以采用消息或者dll啥的” 能不能详细讲讲

同事给我提的建议是用回调函数,不知哪位高手能指导一下!

谢谢!!!!!!!
Arthur_ 2007-07-05
  • 打赏
  • 举报
回复
我也做过全局变量的测试,虽然编译没有问题,但是还是没有得到正确的结果,所以我认为对于这个多进程的程序而言,不可能用全局变量
=========================================
1. 如果用dll 裡面放變量需要設置共享區, 否則結果肯頂不正確

2. 只要是有親緣關係的是可以共享全據變量的(父子關係)
星羽 2007-07-04
  • 打赏
  • 举报
回复
在一个进程内可以用全局变量,跨进程可以用共享数据段只类的
fflush 2007-07-04
  • 打赏
  • 举报
回复
可以使用全局变量,你那个程序就一个进程,所有东西都在一个进程里面
softwarewander 2007-07-04
  • 打赏
  • 举报
回复
顶!
jixingzhong 2007-07-04
  • 打赏
  • 举报
回复
当然可用,
但是全局容易带入问题,
需要谨慎控制 。。。
blackpool 2007-07-04
  • 打赏
  • 举报
回复
不在同一个工程中,只是include了头文件

如果不在同一个工程中,就表示是在不同的进程里面吗?

进程间通信的方法是怎么样呢? 能否详细讲一下? 谢谢!

我的想法就是测试用例中调用了宏,在宏定义中就保存字符串信息,然后在UI中输出信息
进程间通信怎么办?
universes 2007-07-04
  • 打赏
  • 举报
回复
在同一个工程里也要保证他们是线程,而不是fork,exec出来的进程
universes 2007-07-04
  • 打赏
  • 举报
回复
那偶在最底层宏定义中定义一个全局变量,然后在UI中输出是可行的吗?
-----------------------
像fengdream说的,你首先确定你的这些函数是不是在同一个工程里?如果是,那么可以;如果不是,那么不可以。
如果不可以的话,建议你使用进程间通信的方法
fengdream 2007-07-04
  • 打赏
  • 举报
回复
全局变量可以在不同层之间使用吗?
----------------------------------------
当全局变量在同一工程时可以,不同线程可以共享全局变量
blackpool 2007-07-04
  • 打赏
  • 举报
回复
那偶在最底层宏定义中定义一个全局变量,然后在UI中输出是可行的吗?
universes 2007-07-04
  • 打赏
  • 举报
回复
楼上的错了
syy64是对的
全局变量只能在同一个进程里使用,同一个进程的不同线程可以共享全局变量。
而不同的进程会有各自独立的代码段、全局数据区等,即使你代码里是同一个全局变量,在不同的进程里都会分配一个内存空间,彼此间没有任何联系。
  • 打赏
  • 举报
回复
全局的意思就是所有都可以使用
syy64 2007-07-04
  • 打赏
  • 举报
回复
全局变量只在一个进程里面有效吧。
cceczjxy 2007-07-04
  • 打赏
  • 举报
回复
全局变量应该可以啊.
dxcnjupt 2007-07-04
  • 打赏
  • 举报
回复
首先你用的开发工具是什么。
如果是VC的话,两个工程就不可能是一个进程
如果是linux下面的话,要看你MAKEFILE怎么写

一个比较简单但是不一定准确的判断方法:看最后生成的EXE文件有几个???

babala512 2007-07-04
  • 打赏
  • 举报
回复
在不同进程之间实现数据共享 在windows可以采用内存影射的方法 也可以采用消息或者dll啥的
加载更多回复(9)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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