24
    #define TYPE_CHECK(T, S)                                     \
    while (false) {                                              \
      *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);      \
    }

Google v8のコードを読んでいて、タイプチェック用の上記のマクロを見つけました。

しかし、なぜそれが機能するのかわかりません。while(false)は実行されませんよね?誰かがそれらの行を説明できますか?ありがとう

4

2 に答える 2

12

かなり凝ったハック-マクロの目的は、タイプがタイプSに割り当て可能であるかどうか(つまり、そのサブクラスであるかどうか)をチェックすることであるようTです。そうでない場合、からS*にキャストされたポインターT*はコンパイラー・エラーを生成します。while (false)は、コードが実際に他の効果を発揮するのを防ぎます。

于 2011-03-08T19:21:57.530 に答える
7

はい。ただし、コンパイラはループの内容に対して構文とセマンティックのチェックを実行します。したがって、何かが間違っている場合(つまり、からS*への暗黙の型変換T*が不正であり、がも基本クラスでTもない場合に発生します)、コンパイルは失敗します。それ以外の場合、オプティマイザは到達不能なコードを検出してサイレントに削除するため、結果のマシンコードの品質は影響を受けません。SS

于 2011-03-08T19:21:19.123 に答える