每当我在调试代码时从 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));
}
恕我直言这个更像是人类写出来的结果,但话又说回来,我不知道。
最佳答案
两件事:
缩进实际上很好,虽然现在不寻常(我个人讨厌它):他们使用四个缩进,这是通过空格实现的,但对所有八的倍数使用制表符。这曾经是几乎所有地方的标准(值得注意的是,它仍然是 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)); }
虽然仍然不寻常,但完全合乎逻辑且清晰易读。
标准库仅使用保留标识符以避免名称与客户的 C++ 代码冲突,这是一种很好的风格(甚至是强制要求?)。这些保留名称要么是以下划线开头的名称,后跟大写字母(
_DEBUG_LT_PRED
,_Key
),要么是两个下划线(不在此代码中,但 GCC libstdc++ 乱七八糟与__x
等)。
因此是字母汤。
但是,是的,这段代码确实是手动编写的——至少在 GCC 的情况下是这样。 libstdc++ 的事件源代码分支看起来与上面的代码完全相同,并且不是自动生成的。
关于c++ - Visual C++ STL 是人工生成的还是代码生成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7157308/