デバッグ、ロギング、スタックトレース表示などのマクロのセットがあります。そのうちの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