#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)