嵌入式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:


目录
相关文章
|
22天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
39 1
|
22天前
|
人工智能 安全 算法
基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。
本文深入探讨了基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。C语言因其高效、可移植、灵活及成熟度高等特点,在嵌入式系统开发中占据重要地位。文章还介绍了从系统需求分析到部署维护的完整开发流程,以及中断处理、内存管理等关键技术,并展望了嵌入式系统在物联网和人工智能领域的未来发展。
46 1
|
6月前
|
C语言
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
|
6月前
|
安全 Unix Linux
嵌入式C语言(十四)
嵌入式C语言(十四)
45 0
|
4月前
|
算法 IDE 程序员
C语言与嵌入式系统:嵌入式C编程基础。
C语言与嵌入式系统:嵌入式C编程基础。
92 0
|
6月前
|
存储 移动开发 C语言
技术心得记录:嵌入式开发中常用到的C语言库函数
技术心得记录:嵌入式开发中常用到的C语言库函数
64 1
|
6月前
|
C语言
C语言实现电子音乐相册---粤嵌GEC6818嵌入式系统实训
C语言实现电子音乐相册---粤嵌GEC6818嵌入式系统实训
|
6月前
|
存储 算法 Linux
嵌入式C语言(十三)
嵌入式C语言(十三)
29 0
|
7月前
|
数据处理 调度 C语言
C语言:嵌入式硬件利器
C语言:嵌入式硬件利器
|
算法 Linux Android开发
本CSDN博主将与北京航天航空大学出版社合作出版&lt;嵌入式C语言技术实战开发&gt;一书
本书作者由以下成员合作编写:     杨源鑫,主编,毕业于广州科技贸易职业学院电子应用技术专业,在校期间一并考取了华南理工大学本科数字媒体艺术专业。2015年7月工作至今,任伟易达集团嵌入式系统工程师一职,主要从事单片机,linux,Android底层开发等相关的技术。
2984 0
下一篇
DataWorks