GNU C的语法扩展(1)
  xfEU0RRJpeyr 2023年11月02日 74 0




GNU C的语法扩展(1)_操作数


要研究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运算符。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: GNU C语法扩展(3) 下一篇: GNU C语法扩展(9)
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  JBfJ5LpBD0AJ   2023年11月13日   23   0   0 初始化链表#define
  kN2oy7RL3Y7v   2023年11月02日   71   0   0 #defineide#include
  xfEU0RRJpeyr   2023年11月02日   49   0   0 代码块#definei++
  xfEU0RRJpeyr   2023年11月02日   36   0   0 #definesed编译器
xfEU0RRJpeyr