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

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

3天内不再提示

那些在C语言中存在但是不建议使用的关键词!

电子工程师 来源:嵌入式悦翔园 作者:嵌入式悦翔园 2022-08-08 10:37 次阅读

一、前言

我们在学校学习或者有参加过C语言培训的话应该都通过不建议使用goto语句,但是一般都不会有人告诉你为什么不建议使用goto语句,类似于这种存在但不建议使用的关键词还有很多,今天我们就一起来看看那些在C语言中存在但是不建议使用的那些关键词!

二、慎用goto关键词

关于goto语句的争议已经不是一天两天了,大部分C语言老师在讲到goto这关键字的时候一般都会叫大家慎用goto关键字。既然goto语句C语言标准中定义了,那为什么不建议使用呢?

因为goto语句不仅让代码的可读性很差,随意的跳出还会给程序带来安全隐患。但正是这种几乎被各大公司明令禁止使用的语句,在Linux内核中却被大量使用着。这只能说明一点,那就是因为我们水平太菜了,公司怕因为你的一句goto造成代码莫名跑飞!

早期的程序员用goto来解决代码无法预料的后果,遇到什么问题就用一句goto,让程序跳转到某个指定语句。

但是如果你的水平不够,不能完全理解整个代码的执行过程的话,贸然使用goto就可以出现莫名的问题,并且程序还很难被查到!

不建议使用goto语句的原因还有以下几点原因:

goto语句可以被结构化程序的别的语句代替;

goto语句会导致程序可读性下降,因为在实际程序中,goto可以跳到任何地方,可以往前可以往后,看程序慢慢看,看到goto然后又要去找标识符到底跳到了哪里,可读性严重下降,让读程序的人很不舒服;

调试不舒服,调试程序时,由于有goto乱跳的,这就很难调试,去掉嘛,要重新写代码,不去掉,无从下手;

存在即合理,goto语句也不例外,goto它存在,确实在某些程序中使用可能有好处,但在我们学习的阶段,应该尽量不要碰这类程序,养成一个好的编程习惯。记住一句话:**别人写的goto我能看懂,但是我自己不会去写goto!**

三、慎用extern关键词

在C语言程序中,我们用extern关键字对某个变量作 “外部变量申明” ,表示该变量是一个已经定义的外部变量,编译器就会自动地在所有源文件里面查找该变量的定义。

但是在公司编程规范中有明确要求:不允许在C文件中使用 “extern” 来申明外部函数或全局变量

具体原因如下(其中一点原因):

这样使用extern来定义全局变量确实能给我们带来了很大的便利,从而节省了我们很多的时间和精力。但是这样做也会存在一些危险,比如我们在c3.c文件引用的在a1.c文件的funca函数原型由UINT funca(UINT uiValue)变为UINT funca (UINT uiValue1, UINT uiValue2)我们在编译的时候不会报错,但是在我们执行程序的时候会在使用该函数的时候存在危险,尤其是该函数若有一个参数为指针,极有可能会存在对指针的误操作,而引起异常。

嵌入式特别是单片机的程序,最易犯的错误是全局变量满天飞。此现象在早期汇编转型过来的程序员以及初学者中常见,这帮家伙几乎把全局变量当作函数形参来用。

每当看到这种程序,我总要戚眉变脸而后拍桌怒喝。没错,就是怒喝,我不否认全局变量的重要性,但我认为要十分谨慎地使用它,滥用全局变量会引申带来其它更为严重的结构性系统问题。

滥用全局变量会造成不必要的常量频繁使用,特别当这个常量没有用宏定义“正名”时,代码阅读起来将万分吃力。

会导致软件分层的不合理,全局变量相当于一条快捷通道,它容易使程序员模糊了“设备层”和“应用层”之间的边界。写出来的底层程序容易自作多情地关注起上层的应用。这在软件系统的构建初期的确效率很高,功能调试进度一日千里,但到了后期往往bug一堆,处处“补丁”,雷区遍布。说是度日如年举步维艰也不为过。

由于软件的分层不合理,到了后期维护,哪怕仅是增加修改删除小功能,往往要从上到下掘地三尺地修改,涉及大多数模块,而原有的代码注释却忘了更新修改,这个时候,交给后来维护者的系统会越来越像一个“泥潭”,注释的唯一作用只是使泥潭上方再加一些乌烟瘴气。

全局变量大量使用,少不了有些变量流连忘返于中断与主回圈程序之间。这个时候如果处理不当,系统的bug就是随机出现的,无规律的,这时候初步显示出病入膏肓的特征来了,没有大牛来力挽狂澜,注定慢性死亡。

无需多言,您已经成功得到一个畸形的系统,它处于一个神秘的稳定状态!你看着这台机器,机器也看着你,相对无言,心中发毛。你不确定它什么时候会崩溃,也不晓得下一次投诉什么时候道理。

然后,我告诉大家现实层面的后果是什么。

“老人”气昂昂,因为系统离不开他,所有“雷区”只有他了然于心。当出现紧急的bug时,只有他能够搞定。你不但不能辞退他,还要给他加薪。

新人见光死,但凡招聘来维护这个系统的,除了改出更多的bug外,基本上一个月内就走人,到了外面还宣扬这个公司的软件质量有够差够烂。

随着产品的后续升级,几个月没有接触这个系统的原创者会发现,很多雷区他本人也忘记了,于是每次的产品升级维护周期越来越长,因为修改一个功能会冒出很多bug,而按下一个bug,会弹出其他更多的bug。在这期间,又会产生更多的全局变量。终于有一天他告诉老板,不行啦不行啦,资源不够了,ram或者flash空间太小了,升级升级。

客户投诉不断,售后也快崩溃了,业务员也不敢推荐此产品了,市场份额越来越小,公司形象越来越糟糕。

以上关于extern的建议来源于黄工的分享

四、慎用指针

指针对于初学者来说本来就是一个不易理解的东西,初学者一般都不能够真正的理解指针,并且正确的使用指针,下面是初学者常犯的错误:

空指针:指针值为NULL的指针叫空指针,不能运行解引用,一旦解引用空指针就会产生段错误。

NULL在大多数系统的值为0,该地址储存操作系统重启的数据。

NULL也被当作错误标志,如果函数的返回值是指针类型,当它的值是NULL时说明执行出现错误。

如何避免空指针产生的段错误:对来历不明的指针进行解引用前要先判断是否为空

野指针:指针变量的值是不确定的,随机的,未知的,这种指针被称为野指针。

对野指针进行解引用的后果:一切正常 (运气好)、段错误 (大概率)、脏数据 (堆内存申请的越多,脏数据可能性越大)。

终结出来还是那句话:**别人写的goto我能看懂,但是我自己不会去写goto!**

五、编程规范

我在这里给大家分享一写我们公司的编程规范,大家可以学习一下!

不允许在C文件中使用“extern”来申明外部函数或全局变量;

禁止使用八进制数;

bit位变量移植性差,应避免使用。推荐使用boolean类型;

bit fields位域变量移植性差,不应使用;

uint, sint使用机器字长,虽然速度快,但有溢出风险,应避免使用;

指针的数学运算只能用在指向数组或数组元素的指针上;

指针减法只能用在指向同一数组中元素的指针上;

数组的索引应当是指针数学运算的唯一可允许的方式;

不应在指针类型和整型之间进行强制转换;

不应在某类型对象指针和其他不同类型对象指针之间进行强制转换;

如果指针所指向的类型带有const 或volatile 限定符,那么移除限定符的强制转换是不允许的;

数学运算时,应有效防止数据溢出;

六、结语

关于编程规范的问题其实还有很多需要注意的事情,如果大家感兴趣的话可以搜索一下网上总结好的编程规范范文,尤其是初学者,在最开始就要养成一个良好的编程习惯,不理解的东西就尽量不要使用!

最后愿读到这篇文章的程序员们写的代码永无bug!

审核编辑 :李倩

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

    关注

    180

    文章

    7606

    浏览量

    137064
  • 代码
    +关注

    关注

    30

    文章

    4797

    浏览量

    68710

原文标题:十年老程序员给我的一些C语言建议,真的是受益终生!

文章出处:【微信号:嵌入式悦翔园,微信公众号:嵌入式悦翔园】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言中申请的堆内存能不能自动释放

    C语言中申请的堆内存能不能自动释放?每次都要手动 free 太麻烦,也容易忘记。 学过 C++ 的同学,应该首先能想到智能指针。 但是这是C
    的头像 发表于 11-27 09:33 128次阅读

    C语言中的socket编程基础

    Socket编程简介 Socket是一种通信机制,允许程序之间进行通信。C语言中,socket编程是网络编程的基础。通过使用socket,程序可以发送和接收数据,实现不同计算机之间的通信
    的头像 发表于 11-01 16:51 357次阅读

    C语言关键字--typedef

    C语言关键字使用方法学习指南!
    的头像 发表于 10-07 12:44 284次阅读

    探索AC自动机:多关键词搜索的原理与应用案例

    引言 目前,大多数自由文本搜索技术采用类似于Lucene的策略,通过解析搜索文本为各个组成部分来定位关键词。这种方法处理少量关键词时表现良好。但当搜索的关键词数量达到10万个或更多时
    的头像 发表于 08-26 15:55 911次阅读
    探索AC自动机:多<b class='flag-5'>关键词</b>搜索的原理与应用案例

    c语言中从左到右结合怎么看

    C语言中,操作符的结合性(Associativity)是指当操作符表达式中连续出现时,它们如何与操作数结合的顺序。对于大多数二元操作符(即需要两个操作数的操作符),
    的头像 发表于 08-20 11:42 948次阅读

    中国信通院发布“2024云计算十大关键词

    据研究所所长何宝宏会上对“2024云计算十大关键词”进行了解读。中国信通院云大所何宝宏所长发布2024云计算十大关键词十大关键词分别是:应用现代化、大模型云服务、智
    的头像 发表于 08-02 08:28 644次阅读
    中国信通院发布“2024云计算十大<b class='flag-5'>关键词</b>”

    nlp自然语言处理基本概念及关键技术

    、问答系统、文本摘要等众多领域有着广泛的应用。 1. NLP的基本概念 1.1 语言模型 语言模型是NLP的基础,它用于描述一个句子自然语言中出现的概率。
    的头像 发表于 07-09 10:32 643次阅读

    快速掌握C语言关键

    C语言中的32个关键字你知道多少个呢?根据关键字的作用分为四类:数据类型关键字、控制语句关键字、
    的头像 发表于 07-06 08:04 362次阅读
    快速掌握<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>关键</b>字

    嵌入式系统中C语言结构体的基础实现与应用

    C语言中的数组只能允许程序员定义存储相同类型数据。但是结构是C语言编程中允许您存储不同数据类型的数据。
    发表于 03-12 14:29 514次阅读
    嵌入式系统中<b class='flag-5'>C</b><b class='flag-5'>语言</b>结构体的基础实现与应用

    C语言中的typedef的应用

    C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE。
    发表于 03-06 11:34 397次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的typedef的应用

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

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

    C语言中的错误处理机制解析

    C 语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据。
    的头像 发表于 02-26 11:19 523次阅读

    vb语言c++语言的区别

    Microsoft开发的一种面向对象的事件驱动编程语言。它的设计目标是简化编程过程,让初学者也能快速上手。与之相比,C++语言是一种通用的、面向对象的编程语言,其设计目标是提供高性能的
    的头像 发表于 02-01 10:20 2376次阅读

    枚举有多大?c语言枚举end的作用是什么?

    枚举有多大?c语言枚举end的作用是什么? 枚举C语言中是一种常见的数据类型,用于定义一组相互关联的常量或者变量。它通常用于表示一系列可能
    的头像 发表于 01-19 14:19 627次阅读

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析  C
    的头像 发表于 01-12 16:03 5846次阅读