log4cplus代码片段01-无名namespace

在Properties类实现中,有一段过滤字符串空格的实现:

namespace log4cplus { namespace helpers {

namespace
{


static
int
is_space (tchar ch)
{
#if defined (UNICODE)
    return std::iswspace (ch);
#else
    return std::isspace (static_cast<unsigned char>(ch));
#endif
}


static
void
trim_leading_ws (tstring & str)
{
    tstring::iterator it = str.begin ();
    for (; it != str.end (); ++it)
    {
        if (! is_space (*it))
            break;
    }
    str.erase (str.begin (), it);
}


static
void
trim_trailing_ws (tstring & str)
{
    tstring::reverse_iterator rit = str.rbegin ();
    for (; rit != str.rend (); ++rit)
    {
        if (! is_space (*rit))
            break;
    }
    str.erase (rit.base (), str.end ());
}


static
void
trim_ws (tstring & str)
{
    trim_trailing_ws (str);
    trim_leading_ws (str);
}


} // namespace
...
} // namespace helpers
} //namespace log4gcplus

1. 该段代码功能分解的很彻底, 

is_space判断一个字符是否是空格

trim_leading_ws去除string leading的空格

trim_trailing_ws去除string trailing的空格

trim_ws调用trim_leading_ws, trim_trailing_ws,去除leading和trailing的空格.

注意trim_trailing_ws中使用的是反向迭代器, erase的时候, 需要将其转换一下: str.erase (rit.base (), str.end ());

2. 无名namespace的作用:

(Refer to: http://blog.csdn.net/touzani/article/details/1637776)

上面的代码中,在log4cplus和helpers namespace中,还嵌套了一个无名的namespace. is_space, trim_leading_ws, trim_trailing_ws, trim_ws都是在该无名namespace中定义的.它的作用是什么呢?

标准C++引入命名空间,除了可以避免成员的名称发生冲突之外,还可以使代码保持局部性,从而保护代码不被他人非法使用。如果目的主要是后者,而且又为替命名空间取一个好听、有意义、且与别人的命名空间不重名的名称而烦恼的话,标准C++允许定义一个无名命名空间。可以在当前编译单元中(无名命名空间之外),直接使用无名命名空间中的成员名称,但是在当前编译单元之外,它又是不可见的。

无名命名空间的定义格式为:
namespace {
...
}

实际上,上面的定义等价于:(标准C++中有一个隐含的使用指令)
namespace $$$ {
...
}
using namespace $$$;

在C浯言中可以用static声明一个函数,其作用也是使该函数的作用域限于本文件。C++保留了用static声明函数的用法,同时提供了用无名命名空间来实现这一功能。

posted @ 2013-02-06 13:26  金石开  阅读(756)  评论(0编辑  收藏  举报