GNU C的语法扩展(1)

6217760-e609897bd82c4891.png

要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特性对于我们分析内核有着很重要的作用,下面做些总结性的工作。

1 语句表达式

  • GNUC把包含在括号中的复合语句看做是一个表达式,称为语句表达式,它可以出现在任何允许表达式的地方,你可以在语句表达式中使用循环、局部变量等,原本只能在复合语句中使用。

  • 复合语句的最后一个语句应该是一个表达式,它的值将成为这个语句表达式的值。

  • 例如:该语句就是一个合法的复合语句,它的值为foo()。

({\
    int y=foo();\
    int z; \
    if(y>0)\
        z=y;\
    else\
        z=-y;\
    z;\
})
  • 这种特性在宏定义中尤为安全。(因为他们对操作数只进行一次赋值)。这里定义了一个安全的求最小值的宏,在标准C中,通常定义为:
#define max(a,b) ((a)>(b)?(a):(b))
  • 在这种定义下,a和b将进行两次运算,如果他们有副作用的话将会得到错误的结果。在GNU C中,如果你知道操作数的类型(这里假定为整型),你可以这样来定义这个宏:
#define maxint(a,b) ({int_a=(a),_b=(b); _a>_b?_a:_b;})
  • 在嵌入式语句中,不允许使用常量表达式,如枚举常量、位域常量和初始化静态变量。当然,如果你不知道参数的具体类型,你也可以使用typeof或__auto_type运算符。

===========我是华丽的分割线===========


更多知识:
点击关注专题:嵌入式Linux&ARM

或浏览器打开:https://www.jianshu.com/c/42d33cadb1c1

或扫描二维码:

6217760-e6bba06e005d8fe7.jpg

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leon_George

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值