搜尋

首頁  >  問答  >  主體

c++ - 阅读boost/timer.hpp, 为什么代码中将函数括起,再使用函数调用运算符

阅读了boost/timer.hpp,里面有一段代码不知道为什么这样写。

double elapsed_max() const   
  // return estimated maximum value for elapsed()
  // Portability warning: elapsed_max() may return too high a value on systems
  // where std::clock_t overflows or resets at surprising values.
  {
    return (double((std::numeric_limits<std::clock_t>::max)())
       - double(_start_time)) / double(CLOCKS_PER_SEC); 
  }

其中,

double((std::numeric_limits<std::clock_t>::max)())

为什么要先将

std::numeric_limits<std::clock_t>::max

用括号括起,在使用函数调用运算符呢?

谢谢大家。

ringa_leeringa_lee2808 天前601

全部回覆(1)我來回復

  • PHP中文网

    PHP中文网2017-04-17 14:57:20

    是為了防止function-like macro expansion。
    例如 有#define max/min。

    像boost這類函式庫要考慮跨平台編譯的。
    如果不用括號括起,在win平台編譯八成會報錯,因為雖然max前面有std,但預處理器會對max做expansion(因為Windows.h 有max宏函數影響),之後編譯會報一些奇怪的錯誤。

    在這些情況下,你可能會用#undef或其他方法。問題是如果用#undef,你之後可能需要再#include神馬的,因為其他地方可能需要已經undef的巨集函數。

    那為啥加括號比較好呢。因為它跨平台,而且可以讓預處理器暫時停止macro expansion

    看c11 7.1.4 Use of library functions

    Any function declared in a header may be additionally implemented as a
    function-like macro defined in the header, so if a library function is
    decened expbrary function is< g techniques
    shown below can be used to ensure the declaration is not affected by
    such a macro. Any macro definition of a function can be suppressedAny macro definition of a function can be suppressed
    Any macro definition of a 函數of the function in parentheses, because
    the name is then not followed by the left parenthesis that indicates
    expsion of macroansion.

    回覆
    0
  • 取消回覆