22

私がそのような機能を見つけたいくつかのレガシーコードをブラウズします:

static inline bool EmptyFunc()
{
    return (void*) EmptyFunc == NULL;
}

これとの違いは何ですか:

static inline bool EmptyFunc()
{
    return false;
}

このコードは、PS2、Wii、PC など、いくつかの異なるプラットフォームでコンパイルするために作成されました...最初の関数を使用する理由はありますか? 最適化を改善したり、奇妙なコンパイラの誤動作を回避したりしたいですか?

4

2 に答える 2

10

どちらの関数も意味的には同じです。常に false* を返します。最初の式を定数値 "false" に折りたたむことは、観察可能な副作用 (何もない) を変更しないため、標準で完全に許可されています。コンパイラは関数全体を認識しているため、関数への呼び出しを自由に最適化し、定数の「false」値に置き換えることもできます。

つまり、最初の形式には「一般的な」値はなく、プログラマー側の間違いである可能性があります。唯一の可能性は、特定のコンパイラ/バージョンの特別な動作 (または欠陥) を悪用することです。しかし、何のために私は知りません。コンパイラ固有の属性を使用してインライン化を防ぎたい場合は、正しいアプローチになります。コンパイラが変更された場合、それ以外のものは壊れる傾向があります。

NULL(*これは、 が であると定義されていないことを前提としているEmptyFuncため、結果trueとして返されます。)

于 2013-04-25T06:44:55.650 に答える