【发布时间】:2011-11-01 16:57:59
【问题描述】:
每当我在调试代码时从 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));
}
cmets 的存在让我觉得它们好像是人写的,但糟糕的格式、在所有开头都随意使用下划线(为什么?)以及像 (++(_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));
}
恕我直言这个更像是人类写出来的结果,但话又说回来,我不知道。
【问题讨论】:
-
我怀疑这些条件是在几年的发展中逐步“成长”的。仅被非常熟悉库内部结构和那里使用的习语的人认为是可读的,目的是编写不超过绝对必要的代码行。可能 STL 设计者的目标与“应用程序”程序员的目标大不相同。
-
所有代码都是人为生成的,因为至少有人给出了关于输出什么以及应该如何格式化的指令。
标签: c++ visual-studio visual-c++ stl