0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

教你们一些提高C编程能力的妙招

FPGA之家 来源:嵌入式软件开发交流 作者:嵌入式软件开发交 2021-05-27 16:03 次阅读

前言

目前C语言被应用得最多的估计就是嵌入式了,在学校学习完C语言,考完等级考试之后,可能就会觉得自己的C语言掌握的还可以了。但这其实只能算入门,像结构体,指针等内容还有很多东西需要去深究,还有GNU的一些补充语法。接下来,我们来探讨一下如何提升!

打怪升级

1. C语言三剑客

C语言经典三剑客《C和指针》《C陷阱与缺陷》《C专家编程》,这三本书相信很多人都听过。对于想提升C编程能力,这三本是绝对要去阅读一下的。单纯阅读肯定很枯燥,所以阅读过程中还是要去动动手的。这三本书的章节其实也没什么必然的关联性,所以建议大家可以挑着看,最近想看研究一下指针,就看“指针”的章节, 想研究动态内存分配, 就看“动态内存分配”章节。毕竟这不是入门书籍。

2. GNU C语法

首先我们先来了解一些概念,ANSI C 、POSIX C、GNU C到底是啥?之间到底有啥关系?

ANSI C :由美国国家标准局为C语言制定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。

POSIX C : POSIX中文翻译:可移植操作系统接口,POSIX标准的诞生是为了统一个操作系统的接口,方便开发者开发程序,写出可移植的代码程序。

GNU C:GNU的C函数库,其实就是glibc,它是Linux上最重要的函数库,它定义了 ANSI C 标准指定的所有的库函数,以及由POSIX或其他UNIX操作系统变种指定的附加特色,还包括有与GNU系统相关的扩展。

OK, 有了上面的概念之后。你可能会明白为什么有时候会看到一些奇怪的语法,然后去查课本又找不到。目前大学里的课本是按ANSI C来编写的,都是标准的C语言语法。所以也不用课本垃圾,语法编写不完整!

回到GNU C上面,GUN C提供了一些新的语法功能,对于做Linux开发的,肯定是必须要接触的。比如:GNU C支持零长度数组。

typedef struct test1{ int len; char a[0]; // 零长度数组 }TEST1;

这个时候数组是不占用内存的,如果声明指针是会占用内存的。这玩意有什么作用呢?简单看一下下面的代码:

#include《stdio.h》#include 《stdlib.h》#include 《string.h》

typedef struct test1{ int a; char b[0]; //零长度数组}TEST1;

int main(){ char str[] = “helloworld”; //malloc分配空间 TEST1* test1 = (TEST1*)malloc(sizeof(TEST1) + 20); printf(“%p

”, &(test1-》a)); printf(“%p

”, (test1-》b)); //字符串复制 memcpy(test1-》b, str, sizeof(str)); printf(“%s

”, test1-》b);}

这个时候我们就可以通过结构体(TEST1)成员b去访问后面的地址了。它更多是被用在长度不确定的数据上。大家还可以去思考对比一下和指针的差异!

更多GNU C相关内容可以到http://www.gnu.org/software/libc/manual 学习,或者后台回复[GNU C]获取pdf下载链接。

3. 阅读开源代码

个人认为,阅读一下好的开源代码或者原厂提供的一些SDK,对于个人编码能力会有很大提升。学习他们一些好的编码规范和整体架构设计理念,最最经典的当然就是Linux系统了。其实阅读源码并不一定要完全理解代码功能之类的 ,我们更多是去学习为什么这么写, 这么写用什么好处。当然了,也并不是所有都是好的,我们也是取其精华去其糟粕嘛!

来看个小例子:

#define MAX( a, b) ( (a) 》 (b)?(a) : (b) )int max( int a, int b){return ((a 》 b)? a : b);}

上面是要对比两个数的大小,一个是用宏实现,一个使用函数实现。你觉得哪个比较好?

首先,宏会比较简洁;然后宏可以传递各种类型的参数,而函数只能传递int类型的;最后函数调用会带来额外的开销,它需要开辟一片栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆栈。

但是宏也有缺点,宏在预编译时会拷贝到所有调用的位置,这样就会使编译出来的文件变大。

所以这需要看实际情况来选择了,这个东西我也是在Linux源码上发现的,Linux最近更新的版本很经常将一些函数替换成宏的形式。所以多阅读,多思考,会提升很快的!

4. 多踩坑,多思考

这东西说起来很虚,实践出真知!只有在做项目的时候,你才会知道,原来某些东西组合起来一起用会有这么多坑。还有就是多思考,多总结,这绝对会事半功倍!不要觉得,反正是“面向浏览器编程”,记那么多干嘛。

总结

说得再多也没用,最主要还是要行动起来。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7598

    浏览量

    136158
  • ANSI
    +关注

    关注

    0

    文章

    28

    浏览量

    20520
  • GNU
    GNU
    +关注

    关注

    0

    文章

    143

    浏览量

    17477

原文标题:如何提高C编程能力

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一些常见的动态电路

    无论是模电还是数电,理论知识相对来说还是比较枯燥,各种电路原理理解清楚不算容易,换种生动形象的方式或许会增加一些趣味性,也更容易理解这些知识。下面整理了一些常见的电路,以动态图形的方式展示。 整流
    的头像 发表于 11-16 09:26 184次阅读
    <b class='flag-5'>一些</b>常见的动态电路

    分享一些常见的电路

    理解模电和数电的电路原理对于初学者来说可能比较困难,但通过一些生动的教学方法和资源,可以有效地提高学习兴趣和理解能力。 下面整理了一些常见的电路,以动态图形的方式展示。 整流电路 单相
    的头像 发表于 11-13 09:28 191次阅读
    分享<b class='flag-5'>一些</b>常见的电路

    TPA3116D2要是PBTL输出,提高开关频率是不是发热量要小一些,但是干扰会不会大些呢?

    TPA3116D2要是PBTL输出,提高开关频率是不是发热量要小一些,但是干扰会不会大些。
    发表于 10-12 08:11

    LED驱动器应用的一些指南和技巧

    电子发烧友网站提供《LED驱动器应用的一些指南和技巧.pdf》资料免费下载
    发表于 09-25 11:35 0次下载
    LED驱动器应用的<b class='flag-5'>一些</b>指南和技巧

    关于音圈电机一些参数的解析

    在日常对接客户的时候,小编多次遇到如下情况,譬如客户上来就问你们的音圈电机速度能做到多快?你们的音圈电机模组精度能做到多高?等等诸如此类的问题,在此,小编想跟大家解释番。 关于音圈电机的速度能做
    的头像 发表于 09-04 08:19 293次阅读
    关于音圈电机<b class='flag-5'>一些</b>参数的解析

    给龙芯公司的一些建议

    首先感谢龙芯公司发布了2k0300蜂鸟开发板,但作为个资深arm开发者,有些建议供你们参考: 希望你们将开发者当成个小白工程师,从下载/编译/到下载到板上的过程出份详细的傻瓜式文档,我们开发者
    发表于 06-21 16:58

    如何提升嵌入式编程能力?

    和仿真:使用模拟和仿真工具来测试你的嵌入式系统,这可以在实际硬件之前发现问题。 通过以上的这些方法,可以逐步提高个人的嵌入式编程技能,并成为名更优秀的嵌入式系统开发者。
    发表于 06-21 10:01

    stm32使用workbench只生成了一些.h和.c文件,然后该如何使用它们?

    使用workbench只生成了一些.h和.c文件,然后该如何使用它们?还需要手动在MDK中建立工程添加标准库再把这些文件加进去么?哪位有相关开发经验,请赐教!
    发表于 05-15 07:29

    C语言的指针用法

    C语言编程中善用指针可以简化一些任务的处理,而对于一些任务(比如动态内存分配),必须要有指针才行的。也就是说精通C指针
    发表于 03-05 14:22 314次阅读
    <b class='flag-5'>C</b>语言的指针用法

    介绍C语言中错误处理和异常处理的一些常用的方法和策略

    C语言是种低级的、静态的、结构化的编程语言,它没有提供像C++或Java等高级语言中的异常处理机制,例如try-catch-finally等。
    的头像 发表于 02-28 14:25 586次阅读

    plc编程语言与c语言的联系 c语言和PLC有什么区别

    语言,主要用于开发各种应用程序。尽管PLC编程语言和C语言有一些相似之处,但它们之间也存在一些明显的区别。 首先,PLC编程语言和
    的头像 发表于 02-05 14:21 3861次阅读

    一些编程软件相关的因素对PLC的影响

    编程软件的选择对于PLC的影响可以是相当大的。
    的头像 发表于 12-13 16:17 581次阅读

    提高嵌入式代码质量的一些方法

    的事情搞复杂,我希望这些文字能给迷惑中的人们指出一些正确的方向,让他们少走一些弯路,基本做到一分耕耘一分收获。
    的头像 发表于 11-30 09:15 433次阅读

    HDMI转DVI黑屏的处理妙招

    ,我们将介绍一些处理HDMI转DVI黑屏问题的妙招,希望对您有所帮助。 首先,确保正确连接了HDMI转DVI的适配器线。微型HDMI(type D)、迷你HDMI(type C)和标准HDMI
    的头像 发表于 11-28 15:50 5273次阅读

    单对以太网(SPE)线缆的一些主要特性、优点和应用

    种变体就是以太网线缆(SPE)。 以太网线缆是种专门为以太网通信设计的线缆,具有一些特殊的特性和优点,使其在各种应用中得到广泛使用。在本文中,我们将详细介绍以太网线缆的主要特性、优点和应用。 首先,以太网线缆具有良好的抗干
    的头像 发表于 11-27 16:19 927次阅读