do...while(0)
阿新 • • 發佈:2018-12-27
一、巨集定義,實現區域性作用域
貼上一段程式碼:
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