Meh*_*dad 31 c++ stl visual-studio visual-c++
我吓坏了,每当我打开从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));
}
Run Code Online (Sandbox Code Playgroud)
评论的存在让我感觉好像是人类写的,但是格式不好,在一切开始时自由使用下划线(为什么?),以及非常难以理解的条件(++(_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));
}
Run Code Online (Sandbox Code Playgroud)
恕我直言,这更像是一个人如果写出来的结果,但话又说回来,我不知道.
Kon*_*lph 32
两件事情:
缩进实际上很好,虽然现在很不寻常(我个人讨厌它):它们使用四个缩进,这是通过空格实现的,但是使用制表符表示所有八的倍数.这曾经是几乎所有地方的标准(特别是它仍然是几个编辑器中的默认设置,如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));
}
Run Code Online (Sandbox Code Playgroud)
虽然仍然不寻常,但它完全合乎逻辑且易读.
标准库仅使用保留标识符以避免与客户的C++代码发生名称冲突,这是一种很好的风格(甚至是强制性的?).这些保留名称是以下划线后跟大写字母(_DEBUG_LT_PRED,_Key)开头的名称,或两个下划线(不在此代码中,但GCC libstdc ++中充斥着__x等等).
因此,字母汤.
但是,是的,这段代码确实是手工编写的 - 至少在GCC的情况下.libstdc ++的活动源分支看起来与上面的代码完全相同,并且不会自动生成.
Mat*_* M. 15
VC++提供的STL由Dinkumware编写(可能已经改编).
据我所知,它是由人类编写的,但经过大量优化,可能会在维护者的口中留下酸味.毕竟,有一个原因,我们建议初学者不要微观优化他们的代码 - 这使得它很难阅读.但是,我们确实希望从库中获得重要优化的STL:我们无论如何都不必维护它.
我自己发现它很可读:
你可能想看看libc ++来说服自己即使是一个人类编写的库,没有遗留代码(它是新鲜的),也会变得非常复杂.示例<algorithm>(喜欢排序算法).
MS STL的原始公司是Dinkumware.他们有这种糟糕的代码风格,即使MS不再使用它们,它看起来仍然存在.我确定这是手写的,可能都是由同一个人写的,我可以给他起名但我不认为我会.
| 归档时间: |
|
| 查看次数: |
2146 次 |
| 最近记录: |