c++ - Visual C++ STL 是人工生成的还是代码生成的?

标签 c++ visual-studio visual-c++ stl

每当我在调试代码时从 Visual Studio 的实现中打开任何与 STL 相关的代码时,我都吓坏了:

// From <xtree>

if (_Where == begin())
    {   // insert at beginning if before first element
    if (_DEBUG_LT_PRED(this->comp,
        this->_Kfn(_Val), _Key(_Where._Mynode())))
        return (_Insert(true, _Where._Mynode(), _Val));
    }
else if (_Where == end())
    {   // insert at end if after last element
    if (_DEBUG_LT_PRED(this->comp,
        _Key(_Rmost()), this->_Kfn(_Val)))
        return (_Insert(false, _Rmost(), _Val));
    }
//...
else if (_DEBUG_LT_PRED(this->comp,
    _Key(_Where._Mynode()), this->_Kfn(_Val))
    && (++(_Next = _Where) == end()
        || _DEBUG_LT_PRED(this->comp,
            this->_Kfn(_Val), _Key(_Next._Mynode()))))
    {   // insert after _Where
    if (_Isnil(_Right(_Where._Mynode())))
        return (_Insert(false, _Where._Mynode(), _Val));
    else
        return (_Insert(true, _Next._Mynode(), _Val));
    }

评论的存在让我觉得好像是人写的,但是格式很差,在所有内容的开头都使用下划线(为什么?),以及像 (++(_Next = _Where) == end() || _DEBUG_LT_PRED ...) 让我觉得它们好像是从另一段源代码生成的,而不是按原样编写的。

有谁知道是哪种情况? (如果它是从其他代码生成的,我很想知道如何/为什么这样做。)


为了记录,这里是同一件事,但“格式正确”:

if (Where == begin())
{
    // insert at beginning if before first element
    if (DEBUG_LT_PRED(this->comp, this->Kfn(Val), Key(Where.Mynode())))
        return (Insert(true, Where.Mynode(), Val));
}
else if (Where == end())
{
    // insert at end if after last element
    if (DEBUG_LT_PRED(this->comp, Key(Rmost()), this->Kfn(Val)))
        return (Insert(false, Rmost(), Val));
}
//...
else if (DEBUG_LT_PRED(this->comp, Key(Where.Mynode()), this->_Kfn(Val))
    && (++(Next = Where) == end()
        || DEBUG_LT_PRED(this->comp, this->_Kfn(Val), Key(Next.Mynode()))))
{
    // insert after Where
    if (Isnil(Right(Where.Mynode())))
        return (Insert(false, Where.Mynode(), Val));
    else
        return (Insert(true, Next.Mynode(), Val));
}

恕我直言这个更像是人类写出来的结果,但话又说回来,我不知道。

最佳答案

两件事:

  1. 缩进实际上很好,虽然现在不寻常(我个人讨厌它):他们使用四个缩进,这是通过空格实现的,但对所有八的倍数使用制表符。这曾经是几乎所有地方的标准(值得注意的是,它仍然是 Vim 等几个编辑器的默认设置)。但因此,只有将标签宽度设置为 8 时,代码才会正确缩进。所以代码 实际上 看起来像这样:

    else if (_Where == end())
        {   // insert at end if after last element
            if (_DEBUG_LT_PRED(this->comp,
                _Key(_Rmost()), this->_Kfn(_Val)))
                return (_Insert(false, _Rmost(), _Val));
        }
    

    虽然仍然不寻常,但完全合乎逻辑且清晰易读。

  2. 标准库仅使用保留标识符以避免名称与客户的 C++ 代码冲突,这是一种很好的风格(甚至是强制要求?)。这些保留名称要么是以下划线开头的名称,后跟大写字母(_DEBUG_LT_PRED_Key),要么是两个下划线(不在此代码中,但 GCC libstdc++ 乱七八糟与 __x 等)。

因此是字母汤。

但是,是的,这段代码确实是手动编写的——至少在 GCC 的情况下是这样。 libstdc++ 的事件源代码分支看起来与上面的代码完全相同,并且不是自动生成的。

关于c++ - Visual C++ STL 是人工生成的还是代码生成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7157308/

相关文章:

c++ - 删除C++字符串中的字符

c++ - 如何为 TTF_RenderText_Solid 添加变量到字符串

C++预处理器位置代码:: block ?

windows - VC++中如何获取函数的真实地址

c++ - rand() 和 Mersenne Twister C++ 实现

c++ - 使用 SSE 操作时的内存访问冲突

visual-studio - 将节点版本的 tsc 与 Visual Studio 2015 TypeScript 扩展一起使用

ios - 来自 Visual Studio 的 Xamarin.ios Today 扩展

c++ - const_cast with bool : if condition ignored

c++ -/MTd 会触发断点但/MDd 不会