【发布时间】:2013-02-28 07:52:00
【问题描述】:
有一组宏,用于调试、日志记录、堆栈跟踪显示等。其中一个是:
#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
【问题讨论】:
-
当你说“两个指针实际上是相同的”时,你到底是什么意思?
_ptr1和_ptr2包含相同的标记序列? -
这意味着如果它们实际上是相同的。 foo(a,a) 表示这些参数相同。
-
int array[(&ptr - &ptr)];是一个很好的尝试,但如果 size-expression 为负数怎么办?这意味着,指针不同,因此有效,但数组声明会导致错误。 -
(bool)(&ptr-&ptr)将前来救援。都可以搞定! -
@Ajay:是的。我只是指出来。我知道如果表达式是恒定的(不幸的是不是),我们可以让它以多种不同的方式工作。
标签: c++ templates visual-c++ compiler-errors static-assert