随笔分类 -  嵌入式C语言自我修养

嵌入式C语言自我修养 13:C语言习题测试
摘要:13.1 总结 前面12节的课程,主要针对 Linux 内核中 GNU C 扩展的一些常用 C 语言语法进行了分析。GNU C 的这些扩展语法,主要用来完善 C 语言标准和编译优化。而通过 C 标准的发展过程我们又发现,对于一些编译器扩展的一些特性,或者其它编程语言(如:C++)中的好的特性和语法, 阅读全文

posted @ 2019-03-20 09:57 宅学部落 阅读(378) 评论(0) 推荐(0)

嵌入式C语言自我修养 12:有一种宏,叫可变参数宏
摘要:12.1 什么是可变参数宏 在上面的教程中,我们学会了变参函数的定义和使用,基本套路就是使用 va_list、va_start、va_end 等宏,去解析那些可变参数列表我们找到这些参数的存储地址后,就可以对这些参数进行处理了:要么自己动手,自己处理;要么继续调用其它函来处理。 void print 阅读全文

posted @ 2019-03-20 09:55 宅学部落 阅读(408) 评论(0) 推荐(0)

嵌入式C语言自我修养 11:有一种函数,叫内建函数
摘要:11.1 什么是内建函数 内建函数,顾名思义,就是编译器内部实现的函数。这些函数跟关键字一样,可以直接使用,无须像标准库函数那样,要 #include 对应的头文件才能使用。 内建函数的函数命名,通常以 __builtin 开头。这些函数主要在编译器内部使用,主要是为编译器服务的。内建函数的主要用途 阅读全文

posted @ 2019-03-20 09:51 宅学部落 阅读(661) 评论(0) 推荐(0)

嵌入式C语言自我修养 10:内联函数探究
摘要:10.1 属性声明:noinline & always_inline 这一节,接着讲 __atttribute__ 属性声明,__atttribute__ 可以说是 GNU C 最大的特色。我们接下来继续讲一下跟内联函数相关的两个属性:noinline 和 always_inline。这两个属性的用 阅读全文

posted @ 2019-03-20 09:48 宅学部落 阅读(425) 评论(0) 推荐(0)

嵌入式C语言自我修养 09:链接过程中的强符号和弱符号
摘要:9.1 属性声明:weak GNU C 通过 __atttribute__ 声明weak属性,可以将一个强符号转换为弱符号。 使用方法如下。 void __attribute__((weak)) func(void); int num __attribte__((weak); 编译器在编译源程序时, 阅读全文

posted @ 2019-03-20 09:45 宅学部落 阅读(368) 评论(0) 推荐(0)

嵌入式C语言自我修养 08:变参函数的格式检查
摘要:8.1 属性声明:format GNU 通过 __atttribute__ 扩展的 format 属性,用来指定变参函数的参数格式检查。 它的使用方法如下: __attribute__(( format (archetype, string-index, first-to-check))) void 阅读全文

posted @ 2019-03-20 09:41 宅学部落 阅读(254) 评论(0) 推荐(0)

嵌入式C语言自我修养 07:地址对齐那些事儿
摘要:7.1 属性声明:aligned GNU C 通过 __atttribute__ 来声明 aligned 和 packed 属性,指定一个变量或类型的对齐方式。这两个属性用来告诉编译器:在给变量分配存储空间时,要按指定的地址对齐方式给变量分配地址。如果你想定义一个变量,在内存中以8字节地址对齐,就可 阅读全文

posted @ 2019-03-20 09:37 宅学部落 阅读(572) 评论(0) 推荐(0)

嵌入式C语言自我修养 06:U-boot镜像自拷贝分析:section属性
摘要:6.1 GNU C 的扩展关键字:attribute GNU C 增加一个 __atttribute__ 关键字用来声明一个函数、变量或类型的特殊属性。声明这个特殊属性有什么用呢?主要用途就是指导编译器在编译程序时进行特定方面的优化或代码检查。比如,我们可以通过使用属性声明指定某个变量的数据边界对齐 阅读全文

posted @ 2019-03-20 09:27 宅学部落 阅读(1516) 评论(0) 推荐(0)

嵌入式C语言自我修养 05:零长度数组
摘要:5.1 什么是零长度数组 顾名思义,零长度数组就是长度为0的数组。 ANSI C 标准规定:定义一个数组时,数组的长度必须是一个常数,即数组的长度在编译的时候是确定的。在ANSI C 中定义一个数组的方法如下: int a[10]; C99 新标准规定:可以定义一个变长数组。 int len; in 阅读全文

posted @ 2019-03-20 09:21 宅学部落 阅读(486) 评论(0) 推荐(0)

嵌入式C语言自我修养 04:Linux 内核第一宏:container_of
摘要:4.1 typeof 关键字 ANSI C 定义了 sizeof 关键字,用来获取一个变量或数据类型在内存中所占的存储字节数。GNU C 扩展了一个关键字 typeof,用来获取一个变量或表达式的类型。这里使用关键字可能不太合适,因为毕竟 typeof 还没有被写入 C 标准,是 GCC 扩展的一个 阅读全文

posted @ 2019-03-20 09:15 宅学部落 阅读(483) 评论(0) 推荐(0)

嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展
摘要:1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核、驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”。说它是C语言吧,貌似又跟教材中的写法不太一样;说它不是 C 语言呢,但是这些程序确确实实是在一个 C 文件中。此时, 阅读全文

posted @ 2019-03-12 18:29 宅学部落 阅读(1098) 评论(0) 推荐(1)

嵌入式C语言自我修养 03:宏构造利器:语句表达式
摘要:3.1 基础复习:表达式、语句和代码块 表达式 表达式和语句是 C 语言中的基础概念。什么是表达式呢?表达式就是由一系列操作符和操作数构成的式子。操作符可以是 C 语言标准规定的各种算术运算符、逻辑运算符、赋值运算符、比较运算符等。操作数可以是一个常量,也可以是一个变量。表达式也可以没有操作符,单独 阅读全文

posted @ 2019-03-12 18:24 宅学部落 阅读(651) 评论(0) 推荐(0)

嵌入式C语言自我修养 02:Linux 内核驱动中的指定初始化
摘要:2.1 什么是指定初始化 在标准 C 中,当我们定义并初始化一个数组时,常用方法如下: 按照这种固定的顺序,我们可以依次给 a[0] 和 a[8] 赋值。因为没有对 a[9] 赋值,所以编译器会将 a[9] 默认设置为0。当数组长度比较小时,使用这种方式初始化比较方便。当数组比较大,而且数组里的非零 阅读全文

posted @ 2019-03-12 18:17 宅学部落 阅读(440) 评论(0) 推荐(0)

导航