RSS 2.0 Feed
C/C++
摘要:   无论你是否采用测试驱动开发(TDD),编写Unit test case都是重要的工作.在项目的各个阶段,我们都需要构建测试、运行测试、报告测试结果. 有很多框架为这个工作提供便利,比如大名鼎鼎的xUnit系列.今天,我准备介绍的是一个轻量级的C++ Unit Test框架:TUT (Template Unit Tests的缩写)    大家第一个想问的问题估计就是:它和CppUnit有什么不同? 它有什么特点?   我觉得最关键的地方在于TUT是一个轻量级的框架,TUT是使用template技术写的,完全没有macro. 除去例子,它的代码一共只有两个头文件.我们完全不用build这个框架然后设置编译连接那么多麻烦,只要在编写Unit test的时候,把这两个头文件拷贝到项目目录或者设置一下头文件的包含路径就可以了.  TUT把Unit test case通过group-test的层次组织,用户可以把相似的test case放到同一个group,这个group有一个唯一的名字, group包含多个test, 包含的test数量取决于你的编译器允许的template嵌套深度.用户可以选择运行所有的测试或者只是部分group,甚至部分test. 在每个test里面,你可以使用TUT提供的一些方法来确认测试结果的正确性,告诉TUT这个测试是成功还是失败.   闲话少说,估计大家喜欢眼见为实,让我们写个例子来看看:   1. 首先包含必要的头文件#include <stdio.h>#include "tut.h"#include "tut_reporter.h"  2. 接着写了一个测试class //测试类,做的事情很简单,记住给它的最大的数字,我们就测试这个类class max_pool{ int m_max;public: max_pool(int x=5) : m_max(x){ printf("%s init max num %d\n", __func__, x); } void try_set_value(int num) { if (num>m_max) m_max = num; } int get_max() { return m_max; }};   3. 写关于test group的代码  /*这个类用在test_basic里面, 我们可以用它来完成一些每个test都需要做的初始化和清理工作, 不过这里只是为了说明, 只是输出点文字*/class obj_init{ public: obj_init() { printf( "obj_init for each test\n"......[阅读全文]

posted @ | Feedback (3) | Filed Under [ C/C++ ]

发现文章发在首页会干扰博客堂显示,所以只发了摘要,有兴趣的同学点文章标题看全文吧。
所谓原子操作,就是"不可中断的一个或一系列操作" , 在确认一个操作是原子的情况下,多线程环境里面,我们可以避免仅仅为保护这个操作在外围加上性能昂贵的锁,甚至借助于原子操作,我们可以实现互斥锁。

很多操作系统都为int类型提供了+-赋值的原子操作版本,比如 NT 提供了 InterlockedExchange 等API, Linux/UNIX也提供了atomic_set 等函数。

前两天有同学问我:在x86上,g_count++ (int类型) 是否是一个原子操作? 我的回答是"不是的, 多个CPU的机器(SMP)上面这就不是原子操作"。
今天想起,在单CPU上这个是否是原子操作呢,但是这个和编译器有关,编译器可能有两种编译方式:
A. 多条指令版本 , 这就不是原子的
MOV 寄存器 , g_count
ADD 寄存器, 1
MOV g_count , 寄存器...

posted @ | Feedback (15) | Filed Under [ C/C++ ]

摘要:参考: http://www.codeproject.com/atl/atlserver.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/vclrfATLServerReference.asp ATL7中除了制作COM和windows组件的大量的工具,还提供了大量的工具类,可以让我们在C++编程方面事半功倍。 微软在MFC中提供的大都是GUI的工具类,对于组件设计和一些服务的编程,未免有力有不逮的地方,ATL除了作为一个FrameWork作为MFC的补充外,还有很多可以单独抽出来使用的工具类,大大方便了我们的编程工作, 特别是在ATL7中,增加了很多这样的工具类,让我们瞧瞧: 1.首先要说的就是CString了,大家对她的感情自然不必多说,以往只有MFC才可以使用未免让人觉得可惜,甚至成为一些人在ATL组件中包含MFC的理由,现在也包含在ATL中了,只要#include? 〈atlstr.h〉就可以了。同样的可以在ATL中使用的还有CSize , CRect ,CPoint 等等。 2.CRegKey,操作注册表的好东东,因为在ATL3中就有了,大家也都很熟悉,就不多介绍了 。 2.HASH工具 - 下面是一个MD5代码:要包含atlcrypt.h头文件 void TestMd5Hash(){?const char* szPassword = "real9video.rm?ts=2003-12-23-16-23-9";?CCryptProv prov;??HRESULT hr = prov.Initialize();?if( hr == 0x8009016L )???prov.Initialize( PROV_RSA_FULL,NULL,MS_DEF_PROV,CRYPT_NEWKEYSET ); ?//这个其实和下面的代码差不多??//CCryptKeyedHash? hash;?//hash.Initialize(prov, CALG_MD5, CCryptKey::EmptyKey, 0);?CCryptMD5Hash hash;?hash.Initialize( prov );?hash.AddString( szPassword );??BYTE buf[1024];?DWORD outLen;?hash.GetValue( buf , &outLen? ); ?printHex( buf , outLen );//这个大家自己实现,打印byte数组的内容 //应该是 BC CB 76 69 78 CF AB 4B 8 D E9 42 32 B0 88 9C } 3.编码装换,下面是Base64和UTF8的转换,要包含atlenc.h void Base64(){?CString sSource = "some string";?int nDestLen = Base64EncodeGetRequiredLength(sSource.GetLength());?CString str64;?Base64Encode((const BYTE*)(LPCSTR)sSource, sSource.GetLength(),str64.GetBuffer(nDestLen), &nDestLen);?str64.ReleaseBuffer(nDestLen);?cout<<(LPCSTR)str64; ?int nDecLen = Base64DecodeGetRequiredLength(nDestLen);?CString strOrig;?Base64Decode(str64, str64.GetLength(), (BYTE*)strOrig.GetBuffer(nDecLen),????????????? &nDecLen);?strOrig.ReleaseBuffer(nDecLen);?cout<<(LPCSTR)strOrig<阅读全文]

posted @ | Feedback (7) | Filed Under [ C/C++ ]