一月 2010

如何测试C++类的Private成员和Static函数

这两天在写一个C++类的单元测试,为了确认运行结果,需要访问C++类的Private成员,

为了不修改被测试的C++类的源代码,比较猥琐地使用宏定义将private改成public,

 

#define private public

#include <xxx.hpp>

...

#undef private

 

 测试static函数,就比较麻烦了

首先要Include相应的c文件,有时交叉引用会导致无法编译通过,相当麻烦。

用C++编译器编译C文件

注意在C的头文件中要加上下面的宏定义

#ifdef __cplusplus
extern "C" {
#endif

C函数定义

#ifdef __cplusplus
}
#endif

或者

extern "C" {

#include "aaa.h"

...

}

libcmt.lib和msvcrtd.lib的冲突问题

今天在编译一个程序时,发生了下面的错误。

libcmt.lib(sprintf.obj) : error LNK2005: _sprintf already defined in msvcrtd.lib(MSVCR80D.dll)

 

调查发现,编译程序中调用的DLL是使用动态链接进行编译的,但是这个程序又链接了一个使用静态链接的库,这两个库恰好又同时用到了sprintf这个函数,这就导致了命名冲突的问题,将两个库都使用动态链接后就改好了这个问题。

MSDN上有一篇文章讲了静态和动态链接的区别。

http://msdn.microsoft.com/en-us/library/abx4dbyh%28VS.80%29.aspx