do{} while(0)宏定义

#define SAFE_FREE(p) do { free(p); p = NULL;} while(0)

一般情况下我们会写成:

#define SAFE_FREE(p) { free(p); p = NULL;}

#include <stdio.h>
#include <stdlib.h>

#define SAFE_FREE(p) {free(p); p = NULL;}

int main(int argc, char *argv[])
{
    int* ptr = (int*)malloc(sizeof(int) * 4);

    // error C2181: 没有匹配 if 的非法 else
    if (NULL != ptr)
        SAFE_FREE(ptr);
    else
        printf("Has already free!\n");

    return 0;
}

如下定义则正确:

#include <stdio.h>
#include <stdlib.h>

#define SAFE_FREE(p) do{free(p); p = NULL;} while(0)

int main(int argc, char *argv[])
{
    int* ptr = (int*)malloc(sizeof(int) * 4);

    if (NULL != ptr)
        SAFE_FREE(ptr);
    else
        printf("Has already free!\n");

    return 0;
}

如果宏函数过大,定义成多行:

#define SAFE_FREE(p) \
do\
{\
    free(p);\
    p = NULL;\
}\
while(0)
原文地址:https://www.cnblogs.com/Robotke1/p/3063786.html