《C语言深度解刨》阅读笔记 Ⅵ

本文详细阐述了C语言编程中的函数编写规则,包括注释、缩进、空行、参数处理、全局变量管理、返回值规定等方面,旨在提高代码可读性和一致性,遵循清晰、简洁和可维护的原则。
摘要由CSDN通过智能技术生成

第七章、函数

  • 函数的由来
  • 编码风格
  • 【规则6-1】每一个函数都必须有注释,即使函数短到可能只有几行。头部说明需要包
    含包含的内容和次序如下:
  • 【规则6-2】每个函数定义结束之后以及每个文件结束之后都要加一个或若干个空行。
  • 【规则6-3】在一个函数体内,变量定义与函数语句之间要加空行。
  • 【规则6-4】逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
  • 【规则6-5】复杂的函数中,在分支语句,循环语句结束之后需要适当的注释,方便区分各支或循环体。
  • 【规则6-6】修改别人代码的时候不要轻易删除别人的代码,应该用适当的注释方式。
  • 【规则6-7】用缩行显示程序结构,使排版整齐,缩进量统一使用4个字符(不使用TAB进)。每个编辑器的TAB键定义的空格数不一致,可能导致在别的编辑器打开你的代码乱成一团糟。
  • 【规则6-8】在函数体的开始、结构/联合的定义、枚举的定义以及循环、判断等语句中的代码都要采用缩行。
  • 【规则6-9】同层次的代码在同层次的缩进层上。
  • 【规则6-10】代码行最大长度宜控制在80 个字符以内,较长的语句、表达式等要分成多行书写。
  • 规则6-11】长表达式要在低优先级操作符处划分新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
  • 【规则6-12】如果函数中的参数较长,则要进行适当的划分。
  • 【规则6-13】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
  • 【规则6-14】如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。
  • 【规则6-15】不要编写太复杂的复合表达式。
  • 【规则6-16】不要有多用途的复合表达式。
  • 【建议6-17】尽量避免含有否定运算的条件表达式。
  • 【规则6-18】参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。如果函数没有参数,则用void 填充。
  • 函数设计的一般原则和技巧
  • 【规则6-19】原则上尽量少使用全局变量,因为全局变量的生命周期太长,容易出错,也会时间占用空间.各个源文件负责本身文件的全局变量,同时提供一对对外函数,方便其它函数使用该函数来访问变量。
  • 【规则6-20】参数命名要恰当,顺序要合理。
     
  • 【规则6-21】如果参数是指针,且仅作输入参数用,则应在类型前加const,以防止该
    指针在函数体内被意外修改。
  • 【规则6-22】不要省略返回值的类型,如果函数没有返回值,那么应声明为void 类型。
    如果没有返回值,编译器则默认为函数的返回值是int类型的。
  • 【规则6-23】在函数体的“入口处”,对参数的有效性进行检查。尤其是指针参数,尽量使用assert宏做入口校验,而不使用if语句校验。(关于此问题讨论,详见指针与数组那章。)
  • 【规则6-24】return 语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结
    束时被自动销毁。
  • 【规则6-25】函数的功能要单一,不要设计多用途的函数。微软的Win32 API就是违反
    本规则的典型,其函数往往因为参数不一样而功能不一,导致很多初学者迷惑。
  • 【规则6-26】函数体的规模要小,尽量控制在80 行代码之内。
  • 【建议6-27】相同的输入应当产生相同的输出。尽量避免函数带有“记忆”功能。
    带有“记忆”功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某种
    “记忆状态“。这样的函数既不易理解又不利于测试和维护。在C 语言中,函数的static
    局部变量是函数的“记忆”存储器。建议尽量少用static 局部变量,除非必需。
  • 【建议6-28】避免函数有太多的参数,参数个数尽量控制在4个或4个以内。如果参数太
    多,在使用时容易将参数类型或顺序搞错。微软的Win32 API就是违反本规则的典型,
    其函数的参数往往七八个甚至十余个。比如一个CreateWindow函数的参数就达11个之
    多。
  • 【建议6-29】尽量不要使用类型和数目不确定的参数。
    C 标准库函数printf 是采用不确定参数的典型代表,其原型为:
    int printf(const chat *format[, argument]⋯);
    这种风格的函数在编译时丧失了严格的类型安全检查。
  • 【建议6-30】有时候函数不需要返回值,但为了增加灵活性如支持链式表达,可以附加
    返回值。
  • 【建议6-31】不仅要检查输入参数的有效性,还要检查通过其它途径进入函数体内的变
    量的有效性,例如全局变量、文件句柄等。
  • 【规则6-32】函数名与返回值类型在语义上不可冲突。
  • 【规则6-33】汇编语言应该被封装并隔离,最好同时定义成宏。在需要汇编指令的地方建议以如下方式封装并隔离这些指令: 汇编函数;C函数;宏。
    出于效率的考虑,有时候必须要嵌入一些简单的汇编指令,如开关中断。如果不管出于什么原因需要这样做,那么最好使用宏来完成。
  • 【规则6-34】声明或定义一个数组时,它的大小应该显式声明。
    【规则6-35】初始化非零数组和结构体的时候要用花括号配对。
    C标准要求初始化数组和结构体的时候,需要用一对花括号将其配对。这条规则不仅有上述要求,还要求当遇到嵌套的结构体时也需要用花括号配对。这条规则强制要求编程者清晰地思考和表达复杂结构类型的数据顺序。
  • 【规则6-36】下列条件成立时,整型表达式的值不应隐式转换为不同的基本类型: 
    ①转换不是带符号的向更宽整数类型的转换;
    ②表达式是复杂表达式;
    ③表达式不是常量而是函数参数;
    ④表达式不是常量而是返回的表达式。
    限制复杂表达式的隐式转换,是为了要求在一个表达式的数值运算序列中,所有的运算应该准确地以相同的数值类型进行。注意,这并不是说表达式中的所有操作数必须具备相同的类型。
  • 【规则6-37】下列条件成立时,浮点类型表达式的值不应隐式转换为不同的类型: 
    ①转换不是向更宽浮点类型的转换:
    ②表达式是复杂表达式;
    ③表达式是函数参数;
    ④表达式是返回表达式。
    还要注意,在描述整型转换时,始终关注的是基本类型而非真实类型。
  • 【规则6-38】整型复杂表达式的值只能强制转换到更窄的类型,且与表达式的基本类型具有相同的符号。
    如果强制转换要用在任何复杂表达式上,可以应用的转换的类型应该严格限制。复杂表达式的转换经常是混淆的来源,保持谨慎是明智的做法。为了符合这些规则,有必要使用临时变量并引进附加的语句。
  • 【规则6-39】浮点类型复杂表达式的值,只能强制转换到更窄的浮点类型。
    对于复杂表达式使用强制转换,往往带有特定的目的性,为了不对读者造成理解上的混淆,应该严格限制可使用的类型和方式。
  • 【规则6-40】函数原型中的指针参数如果不是用于修改所指向的对象,就应该声明为指向const 的指针。
    本规则会产生更精确的函数接口定义。const 限定应当用在所指向的对象而非指针,因为要保护的是对象本身。
  • 【规则6-41】带有non-void返回类型的函数,其所有退出路径都应具有显式的带表达式的return语句。void返回类型的函数不允许使用"return;”语句。
  • 【规则6-42】对指针和数组的读/写操作,必须要用sizeof关键字校验其对象的大小。
  • 【规则6-43】使用memcpy、strcpy等库函数之前,必须先校验目的地址指针是否有效,且判断写入长度。
  • 【规则6-44】使用strncpy库函数代替strcpy库函数。
  • 【规则6-45】指针的数学运算只能用在指向同一数组元素的指针上。
  • 【规则6-46】标准库中保留的标识符、宏和函数,不能被定义、重定义或取消定义。
  • 【规则6-47】不能重用标准库中宏、对象和函数的名字。
  • 【规则6-48】传递给库函数的值必须检查其有效性。(有较多的补充内容)
  • 【规则6-49】不要使用错误指示errno。
  • 【规则6-50】不应使用库<stddef.h>中的宏offsetof. 
  • 【建议6-51】不应使用setjmp宏和longjmp 函数(仅限用于系统热启动和
    冷启动)。
    setjimp和longjmp允许绕过正常的函数调用机制,不应该使用。
  • 【规则6-52】不应使用信号处理工具<signal.h>。信号处理包含了实现定义的和未定义的行为。
  • 【规则6-53】在产品代码中不应使用输人/输出库<stdio.h>。
  • 【规则6-54】不应使用库<stdlib.h>中的函数atof、atoi和atol。
    当字符串不能被转换时,这些函数具有未定义的行为。如果需要使用类似函数,则必须封装使用。
  • 【规则6-55】不应使用库<stdlib. h>中的函数abort、exit、getenv和system。
  • 【规则6-56】不应使用库<time. h>中的时间处理函数。
     
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七十二旹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值