3

デバッグ、ロギング、スタックトレース表示などのマクロのセットがあります。そのうちの1つは次のようなものです。

#define ASSERT_IF_NULL_2(_ptr1, _ptr2) \ 
    ASSERT(_ptr1);  \
    ASSERT(_ptr2);

これは、私が書いたマクロの単純化されたバージョンを超えています。アサーション(ランタイム)が失敗した場合、カスタムアサーションダイアログボックスがあり、そのようなnullチェックの失敗をログファイルに記録します。マクロは、コンパイル時に非ポインターがチェックされるようにも記述されています(静的アサート)。

ここで、2つのポインターが実際に同じであるかどうかを確認するための静的アサートを探しています。例:

int* ptr;
ASSERT_IF_NULL_2(ptr, ptr);

マクロへの両方の引数が同じであるため、コンパイラエラーが発生するはずです。ポインタが同じメモリを指しているかどうかは関係ありません(それはランタイムであるため)。

私は次のような表現を試しました:

int xx;
xx = 1 / (ptr-ptr);
xx = 1 / (&ptr - &ptr);

それらのどれもゼロ除算コンパイラエラーを与えません。void*また、私はテンプレート引数を取るテンプレートで試しました:

template<void* T>
class Sample{};

ただし、ローカル変数ポインターをテンプレートの非型引数に渡すことはできません。

キーワードをサポートしていないVC9を使用しconstexprています(VS2012でもサポートしていません)。代わりに「const」を使用してみましたが、エラーは発生しません。また、式を配列サイズとして使用しましたが、これは常にエラーになります。

int array[(&ptr - &ptr)]; // Even with ptrdiff_t
4

4 に答える 4

-2

おそらくこれらのいずれかを試してください:

ASSERT_IF_NULL(ptr1 == ptr1);
ASSERT(ptr1 != ptr2)

Nawazが指摘したように、コンパイルエラーが必要なので、これを試してください:

1/(ptr1 != ptr2);
1/static_cast<int>(ptr1 != ptr2);
static_assert(ptr1 != ptr2, "Pointers are different")       //if you dont use c++0x look here:http://stackoverflow.com/a/1664651/258418
于 2013-02-28T08:00:22.680 に答える