do{}while0的两个作用

1、作为一种防止宏错误展开的一种防御性写法。
相信很多人都知道,这里不展开了。

2、实现 goto 语句的功能,一次break就可以跳出到后续语句。

do { 
if(...) 
    break; 
... 
}while(0)
// 后续语句

例如:

// https://gitee.com/openharmony/startup_init_lite/blob/master/src/init_read_cfg.c

static char* ReadFileToBuf()
{
    char* buffer = NULL;
    FILE* fd = NULL;
    struct stat fileStat = {0};
    do {
        if (stat(INIT_CONFIGURATION_FILE, &fileStat) != 0 ||
            fileStat.st_size <= 0 || fileStat.st_size > MAX_JSON_FILE_LEN) {
            break;
        }

        fd = fopen(INIT_CONFIGURATION_FILE, "r");
        if (fd == NULL) {
            break;
        }

        buffer = (char*)malloc(fileStat.st_size + 1);
        if (buffer == NULL) {
            break;
        }

        if (fread(buffer, fileStat.st_size, 1, fd) != 1) {
            free(buffer);
            buffer = NULL;
            break;
        }
        buffer[fileStat.st_size] = '\0';
    } while (0);

    if (fd != NULL) {
        fclose(fd);
        fd = NULL;
    }
    return buffer;
}
posted @ 2020-09-19 08:49  schips  阅读(303)  评论(0编辑  收藏  举报