【发布时间】:2012-01-31 05:20:33
【问题描述】:
我定义了一个自定义断言宏。这适用于所有其他比较。但是,我得到编译器错误:
ISO C++ forbids comparison between pointer and integer
当使用如下所示的宏 (DWASSERT) 来比较指针时,如下面的代码所示。
#define DWASSERT(condition,printstatement) if(!condition){ printf(printstatement); assert(condition); }
#include <stdio.h>
int main()
{
int target = 0;
int* ptr1 = ⌖
int* ptr2 = ⌖
//Normal comparison works fine
if(ptr1 == ptr2)
printf("Equal");
//Comparison using Macro generates compiler
//error on the next line
DWASSERT(ptr1 == ptr2, "Pointers not equal!\n");
return 0;
}
虽然我可以简单地避免在这种情况下使用 DWASSERT,但我很好奇为什么会生成此编译器错误。
【问题讨论】:
-
尝试将比较表达式放在括号内,例如:
DWASSERT( ( ptr1 == ptr2 ), "Pointers not equal!\n" ); -
在编写宏时,当使用其中一个宏参数时,默认情况下应将其包裹在括号中。仅当您知道必须删除它们(以及为什么)时才删除括号。有一些宏的用途是添加括号会导致问题,但绝大多数情况相反。
-
您还应该包装这个宏,这样它就不会以意想不到的方式与
if/else语句交互:stackoverflow.com/questions/923822/…