【问题标题】:How to understand function code in definition folder?如何理解定义文件夹中的功能代码?
【发布时间】:2018-02-09 22:08:32
【问题描述】:

算法文件中有简单的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<>()));
    }

【问题讨论】:

  • 第一个提示:模板仅是 c++;所以它不是 c(让我在你因为那个错误而被激怒之前为你删除它)
  • 当然。我找到你了

标签: c++ preprocessor


【解决方案1】:

“如何理解”复杂代码,就是简单地遍历它,一次一个词(或一行),并准确理解它的含义。刚开始时,最好的方法通常是找到任何#defines 并将它们复制粘贴到位。

以第一个例子为例(注意这是如何解决的,而不是它的作用)

template<class _Ty> inline                       

好的,所以我们正在查看一个内联模板...我可以在 cppreference 上查找它们的含义

_Post_equal_to_(_Left < _Right ? _Right : _Left)

看起来像一个宏(因为它在任何 {} 之外)...最好找到该定义是什么,并将其发布到它的位置。如果它调用其他宏(确实如此),那么我将不得不重复,直到我完全理解它在做什么。

constexpr const _Ty& (max)(const _Ty& _Left, const _Ty& _Right)

constexpr & const ... 我也可以查看 cpprefernce。 _Ty& 好吧,我从 cppreference 的模板阅读中知道这是返回模板所基于的类型;我们得到一个返回值和一个left&right。

也许我之前没有看到用于声明函数的语法(最大)......而且我找不到任何关于正在发生的事情的文档;而且我无法理解/找到 c++ 标准。我会在 Stack Overflow 上询问它是否是有效的语法,以及是否有任何理由选择它而不是 max(),因为这是一个特定的问题,我可以发布研究结果;但我知道它在我的编译器中被接受,因为我已经尝试过了。

    _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——这很简单。他们想。他们不需要,有些人会倾向于不同意继续使用它们。我认为不值得进一步扩展这一点,因为它不会帮助任何人。

【讨论】:

  • 我只是不明白为什么那 15 行包含很多宏的代码比这更好? template&lt;class _Ty&gt; inline _Ty my_max(_Ty x, _Ty y) { return x &gt; y ? x : y; }
  • 1.不是 15;第一个功能只有 7 个。 2. 你做了所有的步骤吗,因为constexpr 可能对这里的性能有很大的影响......你仍然试图理解它为什么不同,而不是理解它的全部含义
  • template&lt;class _Ty&gt; inline constexpr const _Ty&amp; my_max(const _Ty&amp; x,const _Ty&amp; y) { return x &gt; y ? x : y; } 现在怎么样?是的,也许我什么都不知道,但我非常了解语法。所以我试图理解宏的意义。
  • 宏可以根据其他定义而改变。所以 DEBUG_LT 可能在调试和发布版本之间做一些不同的事情。它们有何不同?好吧,我相信一旦你找到它们的定义并扩展它们,你就会解决它。
  • #define _DEBUG_LT(x, y) \ _DEBUG_LT_IMPL(x, y, _FILENAME, __LINE__)#define _DEBUG_LT_IMPL _Debug_lt 你是说这个定义吗?我在哪里可以找到这方面的解释?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多