输出部分(Portability)


这一部分,通过若干参数的设定,解决了向不同平台移植时遇到的问题。另外还有一个叫做OStringStream的辅助类,不过morning以为,该类似乎置于helper部分更为合适。

[OStringStream]

相关文件:Portablility.h

其实OStringStream在先前很多地方都曾经出现过,比如:TestFactoryRegistry中、XmlOutputter中、TestAssert中。其作用是将整数转换为字符串并输出,功能上类似于C语言的itoa函数。事实上,从随CppUnit所附的ChangeLog中可以看到,先前正是用的itoa,只不过后来的一次refactoring中,才被OStringStream取代。其实现代码如下:

#if CPPUNIT_HAVE_SSTREAM
#   include <sstream>
    namespace CppUnit {
      class OStringStream : public std::ostringstream 
      {
      };
    }
#else 
#if CPPUNIT_HAVE_CLASS_STRSTREAM
#   include <string>
#   if CPPUNIT_HAVE_STRSTREAM
#       include <strstream>
#   else
#       include <strstream.h>
#   endif

    namespace CppUnit {
      class OStringStream : public std::ostrstream 
      {
      public:
          std::string str()
          {
            (*this) << '\0';
            std::string msg(std::ostrstream::str());
            std::ostrstream::freeze(false);
            return msg;
          }
      };
    }
#else
#   error Cannot define CppUnit::OStringStream.
#endif
#endif

[其他]

相关文件:Portability.h,config-msvc6.h,config-bcb5.h

如前所述,CppUnit提供了一系列可供设置的参数(其实就是一系列宏定义),针对不同平台,你需要做出不同的选择。好在CppUnit的实现者为我们做了很多工作,使我们不用太多考虑这方面的问题,至少在Visual C++ 6.0和Borland C++ Builder 5.0这两个平台上是如此。Portability.h的开头有如下这样一段代码,它依据实际的语言平台(由特定的宏来指定),载入相应的参数设置文件:

#if defined(__BORLANDC__)
#    include <cppunit/config-bcb5.h>
#elif defined (_MSC_VER)
#    include <cppunit/config-msvc6.h>
#else
#    include <cppunit/config-auto.h>
#endif

这里的config-auto.h文件,morning并未在CppUnit的源码中找到,也许是程序作者的一时疏忽。至于在config-xxx.h中出现的那些参数,此处只列举一二,感兴趣的读者可自己去查看源码。

// helper部分的TypeInfoHelper中曾经出现过该宏
// 它表明在bcb和vc中函数std::string::compare的调用方式不一样

// config-msvc6.h
#ifdef CPPUNIT_FUNC_STRING_COMPARE_STRING_FIRST 
#undef CPPUNIT_FUNC_STRING_COMPARE_STRING_FIRST
#endif

// config-bcb5.h
#ifndef CPPUNIT_FUNC_STRING_COMPARE_STRING_FIRST 
#define CPPUNIT_FUNC_STRING_COMPARE_STRING_FIRST  1 
#endif

// 指明编译器是否支持c++的namespace语言特性
// bcb和vc均支持namespace

// config-msvc6.h
#ifndef CPPUNIT_HAVE_NAMESPACES 
#define CPPUNIT_HAVE_NAMESPACES  1 
#endif

// config-bcb5.h
#ifndef CPPUNIT_HAVE_NAMESPACES 
#define CPPUNIT_HAVE_NAMESPACES  1 
#endif

// OStringStream的定义中曾经出现过,指明是否存在<sstream>头文件,
// bcb和vc均包含有<sstream>头文件

// config-msvc6.h
#define CPPUNIT_HAVE_SSTREAM 1

// config-bcb5.h
#define CPPUNIT_HAVE_SSTREAM 1

此外还有一些,仅在某个平台下才会用到的参数,比如,以下内容均只在config-msvc6.h中出现:

// 忽略Debug符号大于255的警告
#if _MSC_VER > 1000     // VC++
#pragma warning( disable : 4786 )
#endif // _MSC_VER > 1000

// 若当前创建的是CppUnit的DLL库,则需要定义CPPUNIT_DLL_BUILD
#ifdef CPPUNIT_BUILD_DLL
#define CPPUNIT_API __declspec(dllexport)
#endif

// 若当前要链接到CppUnit的DLL库,则需要定义CPPUNIT_DLL
#ifdef CPPUNIT_DLL
#define CPPUNIT_API __declspec(dllimport)
#endif

最后,Portability.h中还定义了一些平台无关的参数,它们设定同样也影响着CppUnit的某些特性,比如:

// 若你希望使用传统风格的断言宏,比如:
// assert(), assertEqual()等等,则需将其设定为1
#ifndef CPPUNIT_ENABLE_NAKED_ASSERT
#define CPPUNIT_ENABLE_NAKED_ASSERT          0
#endif

// CPPUNIT_API是在<config_msvc6.h>中被定以的
// 若没有被定以,则表明程序不需要引用或生成CppUnit的DLL库
#ifndef CPPUNIT_API
#define CPPUNIT_API
#undef CPPUNIT_NEED_DLL_DECL
#define CPPUNIT_NEED_DLL_DECL 0
#endif

返回目录