加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C的不同宏功能/内联方法的优缺点

发布时间:2020-12-16 05:47:17 所属栏目:百科 来源:网络整理
导读:According to the C FAQ,C中基本上有3种“内联”代码的实用方法: #define MACRO(arg1,arg2) do { /* declarations */ stmt1; stmt2; /* ... */ } while(0) /* (no trailing ; ) */ 要么 #define FUNC(arg1,arg2) (expr1,expr2,expr3) 为了澄清这
According to the C FAQ,C中基本上有3种“内联”代码的实用方法:
#define MACRO(arg1,arg2) do { 
    /* declarations */ 
    stmt1;   
    stmt2;   
    /* ... */  
    } while(0)    /* (no trailing ; ) */

要么

#define FUNC(arg1,arg2) (expr1,expr2,expr3)

为了澄清这一点,在表达式中使用参数,逗号运算符返回最后一个表达式的值.

要么

使用作为extension to gcc and in the c99 standard支持的内联声明.

do {…} while(0)方法在Linux内核中被广泛使用,但是我经常没有遇到其他两种方法.

我专门提到多语句“函数”,而不是像MAX或MIN这样的单个语句.

每种方法的优点和缺点是什么,为什么在各种情况下选择一种方法?

解决方法

谈到宏的具体使用,即作为“功能”的宏,我将提到在内联函数中不能使用的宏的以下优点:

懒惰论证评估.例如,这样的宏

#define SELECT(f,a,b) ((f) ? (a) : (b))

将保留三元运算符的懒惰参数评估属性:只对所选参数进行评估,而另一个则不进行评估.一个直接的在线函数模拟将提前评估两个参数,从而进行额外的不必要的工作.

访问上下文.可以使用宏来实现“本地功能”的一些相似性,即可以访问局部变量和封闭函数的参数的重复代码片段.

类型独立性(和类型参数).宏允许您编写类型独立的“函数”(见上述示例).如果您无法摆脱类型依赖,您可以将类型作为参数传递给宏.

我以上提到的宏的上述属性可能被误用导致重大失败(因此也可能被视为缺点).但是,这可以说是C语言中的许多语言特征.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读