C++:使用宏比较指针时的编译器错误

bal*_*erc 1 c++ macros assert

我已经定义了一个自定义断言宏.这适用于所有其他比较.但是,我得到编译器错误:

ISO C++ forbids comparison between pointer and integer
Run Code Online (Sandbox Code Playgroud)

当使用下面显示的宏(DWASSERT)来比较指针时,如下面的代码所示.

#define DWASSERT(condition,printstatement)  if(!condition){ printf(printstatement); assert(condition); }

#include <stdio.h>

int main()
{
    int target = 0;
    int* ptr1 = &target;
    int* ptr2 = &target;

    //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;
}
Run Code Online (Sandbox Code Playgroud)

虽然我可以简单地避免在这种情况下使用DWASSERT,但我很好奇为什么会生成此编译器错误.

Gab*_*abe 8

问题是DWASSERT(ptr1 == ptr2, ...扩展到了
if(!ptr1 == ptr2){ printf(...

你看到发生了什么事吗?!ptr1 == ptr2相当于(!ptr1) == (ptr2),并且因为!ptr1是一个整数类型并且ptr2是一个指针类型,你得到你的错误.

要解决此问题,您需要将宏定义更改为:

#define DWASSERT(condition,printstatement)  if(!(condition)){ printf...
Run Code Online (Sandbox Code Playgroud)

另外,请记住,以任意字符串作为格式使用您的方式是一个坏主意printf.在某些时候,有人会给你一个字符串,其中的%东西会破碎.你应该使用像puts(x)printf("%s", x).