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声明函数的用法,同时提供了用无名命名空间来实现这一功能。