如何理解定义文件夹中的函数代码?
How to understand function code in definition folder?
算法文件中有简单的max()
功能代码。也许它是 C++ 代码,但我在这里一无所知。有很多宏。你能解释一下如何理解这种类型的代码吗?为什么使用了很多 #define
?
// TEMPLATE FUNCTION max
template<class _Ty> inline
_Post_equal_to_(_Left < _Right ? _Right : _Left)
constexpr const _Ty& (max)(const _Ty& _Left, const _Ty& _Right)
_NOEXCEPT_OP(_NOEXCEPT_OP(_DEBUG_LT(_Left, _Right)))
{ // return larger of _Left and _Right
return (_DEBUG_LT(_Left, _Right) ? _Right : _Left);
}
template<class _Ty> inline
/* constexpr */ // TRANSITION
_Ty (max)(_XSTD initializer_list<_Ty> _Ilist)
{ // return leftmost/largest
return ((_STD max)(_Ilist, less<>()));
}
"HOW to understand" 复杂的代码,就是简单地浏览它,一次一个单词(或一行),并准确理解它的意思。通常,刚开始时执行此操作的最佳方法是找到任何 #defines
并将它们复制粘贴到位。
以第一个例子为例(注意这是如何计算出来的,而不是它做了什么)
template<class _Ty> inline
好的,所以我们正在查看内联模板...我可以在 cppreference 上查看它们的含义
_Post_equal_to_(_Left < _Right ? _Right : _Left)
看起来像一个宏(因为它在任何 {} 之外)...最好找到那个定义是什么,然后 post 它就位。如果它调用其他宏(确实如此),那么我将不得不重复直到我完全理解它在做什么。
constexpr const _Ty& (max)(const _Ty& _Left, const _Ty& _Right)
constexpr & const ... 那些我也可以在 cpprence 上查找。
_Ty& 好吧,我从 cppreference 的模板阅读中知道这是 returning 模板所基于的类型;我们得到一个 return 值和一个左&右值。
也许我之前没有见过用于声明函数的语法 (max)...而且我找不到任何关于正在发生的事情的文档;而且我无法理解/找到 C++ 标准。我会在 Stack Overflow 上询问它是否是有效的语法,以及是否有任何理由选择它而不是 max()
因为这是一个我可以 post 研究结果的特定问题;但我知道它在我的编译器中被接受,因为我已经尝试过了。
_NOEXCEPT_OP(_NOEXCEPT_OP(_DEBUG_LT(_Left, _Right)))
更多宏 - 好吧,最好找到并粘贴它们;它实际上与另一个问题有关 Use of the noexcept specifier in function declaration and definition? 所以我将阅读它以快进并节省我的时间。
{ // return larger of _Left and _Right
return (_DEBUG_LT(_Left, _Right) ? _Right : _Left);
}
好吧,只有一个宏可以使用(因为它都是大写字母)但是我们之前已经看过这个..有用的评论说明了它的作用。
要回答后者 - 为什么这么多 #define - 这很简单。他们想。他们不需要,有些人会不赞成继续使用它们。我认为不值得进一步扩展这一点,因为它不会帮助任何人。
算法文件中有简单的max()
功能代码。也许它是 C++ 代码,但我在这里一无所知。有很多宏。你能解释一下如何理解这种类型的代码吗?为什么使用了很多 #define
?
// TEMPLATE FUNCTION max
template<class _Ty> inline
_Post_equal_to_(_Left < _Right ? _Right : _Left)
constexpr const _Ty& (max)(const _Ty& _Left, const _Ty& _Right)
_NOEXCEPT_OP(_NOEXCEPT_OP(_DEBUG_LT(_Left, _Right)))
{ // return larger of _Left and _Right
return (_DEBUG_LT(_Left, _Right) ? _Right : _Left);
}
template<class _Ty> inline
/* constexpr */ // TRANSITION
_Ty (max)(_XSTD initializer_list<_Ty> _Ilist)
{ // return leftmost/largest
return ((_STD max)(_Ilist, less<>()));
}
"HOW to understand" 复杂的代码,就是简单地浏览它,一次一个单词(或一行),并准确理解它的意思。通常,刚开始时执行此操作的最佳方法是找到任何 #defines
并将它们复制粘贴到位。
以第一个例子为例(注意这是如何计算出来的,而不是它做了什么)
template<class _Ty> inline
好的,所以我们正在查看内联模板...我可以在 cppreference 上查看它们的含义
_Post_equal_to_(_Left < _Right ? _Right : _Left)
看起来像一个宏(因为它在任何 {} 之外)...最好找到那个定义是什么,然后 post 它就位。如果它调用其他宏(确实如此),那么我将不得不重复直到我完全理解它在做什么。
constexpr const _Ty& (max)(const _Ty& _Left, const _Ty& _Right)
constexpr & const ... 那些我也可以在 cpprence 上查找。 _Ty& 好吧,我从 cppreference 的模板阅读中知道这是 returning 模板所基于的类型;我们得到一个 return 值和一个左&右值。
也许我之前没有见过用于声明函数的语法 (max)...而且我找不到任何关于正在发生的事情的文档;而且我无法理解/找到 C++ 标准。我会在 Stack Overflow 上询问它是否是有效的语法,以及是否有任何理由选择它而不是 max()
因为这是一个我可以 post 研究结果的特定问题;但我知道它在我的编译器中被接受,因为我已经尝试过了。
_NOEXCEPT_OP(_NOEXCEPT_OP(_DEBUG_LT(_Left, _Right)))
更多宏 - 好吧,最好找到并粘贴它们;它实际上与另一个问题有关 Use of the noexcept specifier in function declaration and definition? 所以我将阅读它以快进并节省我的时间。
{ // return larger of _Left and _Right
return (_DEBUG_LT(_Left, _Right) ? _Right : _Left);
}
好吧,只有一个宏可以使用(因为它都是大写字母)但是我们之前已经看过这个..有用的评论说明了它的作用。
要回答后者 - 为什么这么多 #define - 这很简单。他们想。他们不需要,有些人会不赞成继续使用它们。我认为不值得进一步扩展这一点,因为它不会帮助任何人。