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

  • 相关阅读:
    关于表格
    split函数
    javac classpath和java classpath
    ORA01460: 转换请求无法实现或不合理 的原因
    业务流程学习(1)
    启动oracle10监听器错误:本地计算机上的OracleOraDb10g_home1TNSListener服务启动后又停止了 解决方案
    CF1594F. Ideal Farm
    CF1373G. Pawns
    CF1373F. Network Coverage
    CF1515F. Phoenix and Earthquake
  • 原文地址:https://www.cnblogs.com/zhcncn/p/2904512.html
Copyright © 2020-2023  润新知