阅读了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
用括号括起,在使用函数调用运算符呢?
谢谢大家。
是為了防止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