1. 程式人生 > >do...while(0)

do...while(0)

一、巨集定義,實現區域性作用域

貼上一段程式碼:

void print()
{
    cout<<"print: "<<endl;
}
 
void send()
{
    cout <<"send: "<<endl;
}
 
#define LOG print();send();
 
int main(){
    
    if (false)
        LOG
 
    cout <<"hello world"<<endl;
 
    system("pause");
    return 0;
}

顯然,程式碼輸出

send:
hello world

因為define只有替換的作用,所以預處理後,程式碼實際是這樣的:

    if (false)
        print();
    send();
 
    cout <<"hello world"<<endl;

在巨集中加入do...while(0):

#define LOG do{print();send();}while (0);
 
int main(){
    
    if (false)
        LOG
    else
    {
        cout 
<<"hello"<<endl; } cout <<"hello world"<<endl; system("pause"); return 0; }

相當於:

    if (false)
        do{
            print();
            send();
        }while (0);
    else
    {
        cout <<"hello"<<endl;
    }
 
 
    cout <<"
hello world"<<endl;

 

二、替代goto

int dosomething()
{
    return 0;
}
 
int clear()
{
 
}
 
int foo()
{
    int error = dosomething();
 
    if(error = 1)
    {
        goto END;
    }
 
    if(error = 2)
    {
        goto END;
    }
 
END:
    clear();
    return 0;
}

goto可以解決多個if的時候,涉及到記憶體釋放時忘記釋放的問題,但是多個goto,會顯得程式碼冗餘,並且不符合軟體工程的結構化,不建議用goto,可以改成如下:

int foo()
{
    do 
    {
        int error = dosomething();
 
        if(error = 1)
        {
            break;
        }
 
        if(error = 2)
        {
            break;
        }
    } while (0);
    
    clear();
    return 0;
}

參考:

https://blog.csdn.net/majianfei1023/article/details/45246865

https://blog.csdn.net/hzhsan/article/details/15815295