阅读了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
用括号括起,在使用函数调用运算符呢?
谢谢大家。
は、関数のようなマクロ展開を防ぐためのものです。
たとえば、<Windows.h> には #define max/min があります。
boost のようなライブラリでは、クロスプラットフォームのコンパイルを考慮する必要があります。
括弧が使用されていない場合、Win プラットフォームでコンパイルするとエラーが報告される可能性が高くなります。これは、max の前に std があっても、プリプロセッサが max を展開するためです (Windows.h は max マクロ関数の影響を受けるため)。 )、後でコンパイルするといくつかのエラーが報告されます。
このような場合は、#undef またはその他のメソッドを使用できます。問題は、#undef を使用する場合、他の場所で既に undefed マクロ関数が必要になる可能性があるため、後で再度 #include Shenma が必要になる可能性があることです。
では、なぜ括弧を追加したほうが良いのでしょうか?これはクロスプラットフォームであり、 プリプロセッサがマクロ展開を一時的に停止する可能性がある
ためです。c11 7.1.4 ライブラリ関数の使用を参照