GNU C的语法扩展(1)

作者: Leon_Geo | 来源:发表于2019-02-17 13:39 被阅读8次

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

相关文章

  • GNU C的语法扩展(1)

    要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特...

  • GNU C语法扩展(3)

    要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特...

  • GNU C语法扩展(5)

    要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特...

  • GNU C语法扩展(4)

    要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特...

  • GNU C语法扩展(8)

    8、当前函数名 GNU C中预定义两个标志符保存当前函数的名字,__FUNCTION__保存函数在源码中的名字,_...

  • GNU C语法扩展(10)

    要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特...

  • GNU C语法扩展(6)

    要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特...

  • GNU C语法扩展(7)

    我们在拜读Linux内核源代码时,是否会经常遇到一些既熟悉又陌生的C语言语法?熟悉是因为我们对Linux内核中使用...

  • GNU C语法扩展(9)

    要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特...

  • GNU C 对 C 的扩展语法 写法

    这种写法如下: self.tableView.tableHeaderView = ({ UIView *vi...

网友评论

    本文标题:GNU C的语法扩展(1)

    本文链接:https://www.haomeiwen.com/subject/vajgeqtx.html