有一个很妙的地方在于这里的 do{} while(0)的用法,这个宏定义看起来每必要但是在宏替换时用处很大,比如

#include ;
/*#define PRINT() 
do{ printf("I am in the world!n"); 
      printf("I love the world!n"); } while(0)
*/
#define PRINT() 
{ printf("I am in the world!n"); 
   printf("I love the world!n"); }
int main() {
    int i;
    printf("give me a value:n");
    scanf("%d", &i);
    if(i > 5)
    PRINT();
else
    printf("success!n");
    return 0;
}

如果直接编译,这段代码是有问题的,因为在 if 语句后会因为多出的一个分号导致错误,但是若采用被注释的那一段定义 PRINT()则不会有问题。