嵌入式C语言(十二)

简介: 嵌入式C语言(十二)

前言

Linux内核是基于C语言编写的,熟练掌握C语言是深入学习Linux内核的基本要求。

GNU C语言的扩展

GCC的C编译器除了支持ANSI C标准之外,还对C语言进行了很多的扩充。

这些扩充对代码优化、目标代码布局以及安全检查等方面提供了很强的支持,因此支持GNU扩展的C语言称为GNU C语言

Linux内核采用GCC编译器,所以Linux内核的代码自然使用了很多GCC的新扩充特性。

本章介绍一些GCC C语言扩充的新特性,希望读者在学习Linux内核时特别留意。

(1)语句表达式

在GNU C语言中,括号里的复合语句可以看作一个表达式,称为语句表达式。

在一个语句表达式里,可以使用循环、跳转和局部变量等。这个特性通常用在宏定义中,可以让宏定义变得更安全,如比较两个值的大小。

#define max(a,b) ((a) > (b) ? (a) : (b))

上述代码会导致安全问题,a和b有可能会计算两次,比如a传入i++,b传入j++。在GNU C语言中,如果知道a和b的类型,可以这样写这个宏。

#define maxint(a,b) \
          ({int _a = (a), _b = (b); _a > _b ? _a : _b; })

如果你不知道a和b的类型,还可以使用typeof类转换宏。

<include/linux/kernel.h>#define min(x, y) ({        \
typeof(x) _min1 = (x);      \
typeof(y) _min2 = (y);      \
(void) (&_min1 == &_min2);    \
_min1 < _min2 ? _min1 : _min2; })

typeof也是GNU C语言的一个扩充用法,可以用来构造新的类型,通常和语句表达式一起使用。

下面是一些例子。

typeof (*x) y;
typeof (*x) z[4];
typeof (typeof (char *)[4]) m;
  • 第一句声明y是x指针指向的类型。
  • 第二句声明z是一个数组,其中数组的类型是x指针指向的类型。
  • 第三句声明m是一个指针数组,和char*m[4]声明是一样的。

(2)零长数组

GNU C语言允许使用变长数组,这在定义数据结构时非常有用。

<mm/percpu.c>
struct pcpu_chunk {
struct list_head  list;
unsigned long    populated[];  /* 变长数组 */};

数据结构最后一个元素被定义为零长度数组,不占结构体空间

这样,我们可以根据对象大小动态地分配结构的大小。

struct line {
int length;
char contents[0];
};
struct line *thisline = malloc(sizeof(struct line) +this_length);
thisline->length = this_length;

如上例所示,struct line数据结构定义了一个int length变量和一个变长数组contents[0],这个struct line数据结构的大小只包含int类型的大小,不包含contents的大小,也就是sizeof (struct line) =sizeof (int)。

创建结构体对象时,可根据实际的需要指定这个可变长数组的长度,并分配相应的空间,如上述实例代码分配了this_length 字节的内存,并且可以通过contents[index]来访问第index个地址的数据

(3)case范围

GNU C语言支持指定一个case的范围作为一个标签,如:

case low ...high:


目录
相关文章
|
5月前
|
C语言
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
|
5月前
|
安全 Unix Linux
嵌入式C语言(十四)
嵌入式C语言(十四)
40 0
|
3月前
|
算法 IDE 程序员
C语言与嵌入式系统:嵌入式C编程基础。
C语言与嵌入式系统:嵌入式C编程基础。
73 0
|
5月前
|
存储 移动开发 C语言
技术心得记录:嵌入式开发中常用到的C语言库函数
技术心得记录:嵌入式开发中常用到的C语言库函数
58 1
|
5月前
|
C语言
C语言实现电子音乐相册---粤嵌GEC6818嵌入式系统实训
C语言实现电子音乐相册---粤嵌GEC6818嵌入式系统实训
|
5月前
|
存储 算法 Linux
嵌入式C语言(十三)
嵌入式C语言(十三)
24 0
|
6月前
|
安全 算法 开发工具
【C 言专栏】基于 C 语言的嵌入式系统开发
【5月更文挑战第1天】本文探讨了C语言在嵌入式系统开发中的核心作用。嵌入式系统作为专用计算机系统广泛应用于家电、汽车、医疗等领域,具备实时性、低功耗等特点。C语言因其高效性、可移植性和灵活性成为开发首选。文章介绍了开发流程,包括需求分析、硬件选型、软件设计至部署维护,并强调中断处理、内存管理等关键技术。C语言在智能家居、汽车电子和医疗设备等领域的应用实例展示了其广泛影响力。面对硬件限制、实时性要求和安全挑战,开发者需不断优化和适应新技术趋势,以推动嵌入式系统创新发展。
142 0
【C 言专栏】基于 C 语言的嵌入式系统开发
|
6月前
|
数据处理 调度 C语言
C语言:嵌入式硬件利器
C语言:嵌入式硬件利器
|
6月前
|
人工智能 物联网 数据处理
C语言在嵌入式系统中的应用
该文探讨了C语言在嵌入式系统中的应用,强调其优势,如可移植性、高效性、灵活性及社区支持,并列举了在RTOS开发、驱动程序、通信协议实现和简单GUI开发中的应用场景。文中通过LED闪烁程序示例展示了C语言如何控制硬件。结论指出,C语言在嵌入式系统中扮演重要角色,随着技术发展,开发者需不断学习以适应新需求。
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3