zoukankan      html  css  js  c++  java
  • 关于C语言宏定义 使用do{ xxxx }while()

    暂时感觉像是由于“;”的原因,关于使用习惯方面的问题!!

    下面是copy的:

    这样的宏见过么:

    Cpp代码 

    1. #define FOO(x) do {  
    2.     some_code_line_1;  
    3.     some_code_line_2;  
    4. } while (0)

    (注意while(0)后面没有分号) 

    乍一看这个宏不过就是定义了个包含多个语句的local scope,用do..while(0)包围起来简直多此一举。直接这样不就好了么:

    Cpp代码 

    1. #define FOO(x) {  
    2.     some_code_line_1;  
    3.     some_code_line_2;  
    
    
    
    
    
    
    
    



    但问题是这两者不等价…… 

    关键问题是前者定义出来的宏是一个非复合语句,而后者是一个复合语句。C/C++里有些语法结构对复合/非复合语句之间的区别是敏感的,例如说:

    Cpp代码 

    1. if ( someCond )  
    2.     FOO(x);  
    3. else 
    4.     //... 
    
    
    
    
    
    
    
    


    要是FOO(x)展开后是一个复合语句,那么FOO(x)后面的分号“;”就会终结整个if语句,导致else子句孤立而出现编译错误。 
    所以关键是那个while(0)后面不加分号。如果加了分号的话就没意义了。 

    如果用复合语句版本的宏,就要记得不写那个分号:

    Cpp代码 

    1. if ( someCond )  
    2.     FOO(x)  
    3. else 
    4.     //... 


    但是这样与一般的函数调用风格不统一,所以很多人倾向于使用do..while(0)这个trick来把local scope包起来而不是直接用复合语句({..})。 

    印象中这类的宏还有一个变种,

    Cpp代码 

    1. #define FOO(x) switch(0) default: ... 
    
    


    还是怎样的。具体是怎么写的忘记了……以后想起来的话一定得记下来 T T

  • 相关阅读:
    浅谈面向对象语言中对象的使用
    淘宝店铺搜索工具(提升淘宝店铺排名人气)
    JavaScript学习总结二:js闭包(Closure)概念
    JavaScript学习总结一:js常见问题
    GC原理解析(c#)
    VS2010中的测试(2)——单元测试
    VS2010中的测试(3)——数据驱动单元测试
    领域驱动设计实践(二)
    俞敏洪在清华励志演讲
    Ioc最佳实践
  • 原文地址:https://www.cnblogs.com/tingjie-word/p/6060352.html
Copyright © 2011-2022 走看看