【C语言】编程规范——函数

本文介绍了C语言编程中关于函数设计的原则和规范,强调函数应完成单一功能,避免重复代码,控制函数长度和嵌套深度,处理参数合法性,全面处理错误返回码,设计合适的扇入和扇出,及时清理废弃代码。此外,还提出了若干函数编写建议,如使用const关键字,避免全局变量,检查非参数输入的有效性,限制参数数量等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

函数设计的精髓:编写整洁函数,同时把代码有效组织起来。

整洁函数要求:代码简单直接、不隐藏设计者的意图、用干净利落的抽象和直截了当的控制语句将函数有机组织起来。

代码的有效组织包括:逻辑层组织和物理层组织两个方面。逻辑层,主要是把不同功能的函数通过某种联系组织起来,主要关注模块间的接口,也就是模块的架构。物理层,无论使用什么样的目录或者名字空间等,需要把函数用一种标准的方法组织起来。例如:设计良好的目录结构、函数名字、文件组织等,这样可以方便查找。

原则

原则2.1 一个函数仅完成一件功能。

说明:一个函数实现多个功能给开发、使用、维护都带来很大的困难。

将没有关联或者关联很弱的语句放到同一函数中,会导致函数职责不明确,难以理解,难以测试和改动。

案例: realloc。在标准C语言中, realloc是一个典型的不良设计。这个函数基本功能是重新分配内存,但它承担了太多的其他任务:如果传入的指针参数为NULL就分配内存,如果传入的大小参数为0就释放内存,如果可行则就地重新分配,如果不行则移到其他地方分配。如果没有足够可用的内存用来完成重新分配(扩大原来的内存块或者分配新的内存块),则返回NULL,而原来的内存块保持不变。这个

函数不易扩展,容易导致问题。例如下面代码容易导致内存泄漏:

char *buffer = (char *)malloc(XXX_SIZE);
.....
buffer = (char *)realloc(buffer, NEW_SIZE);

如果没有足够可用的内存用来完成重新分配,函数返回为NULL,导致buffer原来指向的内存被丢失。

延伸阅读材料:《 敏捷软件开发:原则、模式与实践》 第八章,单一职责原则(SRP)

原则2.2 重复代码应该尽可能提炼成函数。

说明:重复代码提炼成函数可以带来维护成本的降低。

重复代码是我司不良代码最典型的特征之一。在“代码能用就不改”的指导原则之下,大量的烟囱式设计及其实现充斥着各产品代码之中。新需求增加带来的代码拷贝和修改,随着时间的迁移,产品中堆砌着许多类似或者重复的代码。

项目组应当使用代码重复度检查工具,在持续集成环境中持续检查代码重复度指标变化趋势,并对新增重复代码及时重构。当一段代码重复两次时,即应考虑消除重复,当代码重复超过三次时,应当立刻着手消除重复。

一般情况下,可以通过提炼函数的形式消除重复代码。

示例:

UC ccb_aoc_process( )
{
    ... ...
    struct AOC_E1_E7 aoc_e1_e7;
    aoc_e1_e7.aoc = 0;
    aoc_e1_e7.e[0] = 0;
    ... ... //aoc_e1_e7.e从到赋值,下同
    aoc_e1_e7.e[6] = 0;
    aoc_e1_e7.tariff_rate = 0;
    ... ...
    if (xxx)
    {
        if (xxx)
        {
            aoc_e1_e7.e[0] = 0;
            ... ...
            aoc_e1_e7.e[6] = 0;
            aoc_e1_e7.tariff_rate = 0;
        }
        ... ...
    }
    else if (xxx)
    {
        if (xxx)
        {
            aoc_e1_e7.e[0] = 0;
            ... ...
            aoc_e1_e7.e[6] = 0;
            aoc_e1_e7.tariff_rate = 0;
        }
        ccb_caller_e1 = aoc_e1_e7.e[0];
        ... ...
        ccb_caller_e7 = aoc_e1_e7.e[6];
        ccb_caller_tariff_rate = aoc_e1_e7.tariff_rate;
        ... ...
    }
    ... ...
    if (xxx)
    {
        if (xxx)
        {
            if (xxx)
            {
                aoc_e1_e7.e[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值