有一组宏,用于调试、日志记录、堆栈跟踪显示等。其中一个是:
#define ASSERT_IF_NULL_2(_ptr1, _ptr2) \
ASSERT(_ptr1); \
ASSERT(_ptr2);
这是我编写的宏的简化版本。如果断言(运行时)失败,我有自定义断言对话框,将此类空检查失败记录到日志文件中。还编写了宏,以便在编译时检查非指针(静态断言)。
现在,我正在寻找一些静态断言来检查两个指针是否实际上相同。例子:
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