検索

ホームページ  >  に質問  >  本文

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日前600

全員に返信(1)返信します

  • PHP中文网

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

    は、関数のようなマクロ展開を防ぐためのものです。
    たとえば、<Windows.h> には #define max/min があります。

    boost のようなライブラリでは、クロスプラットフォームのコンパイルを考慮する必要があります。
    括弧が使用されていない場合、Win プラットフォームでコンパイルするとエラーが報告される可能性が高くなります。これは、max の前に std があっても、プリプロセッサが max を展開するためです (Windows.h は max マクロ関数の影響を受けるため)。 )、後でコンパイルするといくつかのエラーが報告されます。

    このような場合は、#undef またはその他のメソッドを使用できます。問題は、#undef を使用する場合、他の場所で既に undefed マクロ関数が必要になる可能性があるため、後で再度 #include Shenma が必要になる可能性があることです。

    では、なぜ括弧を追加したほうが良いのでしょうか?これはクロスプラットフォームであり、 プリプロセッサがマクロ展開を一時的に停止する可能性がある

    ためです。

    c11 7.1.4 ライブラリ関数の使用を参照

    ヘッダーで宣言された関数は、ヘッダーで定義された
    関数のようなマクロとしても追加できるため、ヘッダーがインクルードされるときにライブラリ関数が
    明示的に宣言されている場合、次のテクニックの 1 つが使用されます。
    以下に示すように、宣言がそのようなマクロの影響を受けないようにするために使用できます。名前を囲むことで、関数のマクロ定義をローカルで抑制できます。
    これは、
    名前の後にマクロ関数名の展開を示す
    左括弧が続かないためです。

    返事
    0
  • キャンセル返事