生活知识集
第二套高阶模板 · 更大气的阅读体验

代码重复怎么处理 实用操作步骤与避坑指南

发布时间:2025-12-09 05:41:09 阅读:75 次

代码时,经常会遇到一段逻辑在多个地方反复出现的情况。比如控制硬件设备的初始化流程,或者读取传感器数据的函数,在不同模块里几乎一模一样。这种代码重复不仅让文件变大,还容易出错——改一处忘了改另一处,设备就可能工作异常。

把重复逻辑抽成函数

最常见的做法是把重复的代码块封装成一个独立函数。比如你有三段读取温度传感器的代码,都包含延时、读寄存器、校准数值这些步骤,完全可以提取出来:

uint16_t read_temperature(uint8_t sensor_id) {
    delay(10);
    uint16_t raw = read_register(sensor_id, TEMP_REG);
    return calibrate_value(raw);
}

之后在各个地方直接调用 read_temperature 就行,维护起来也方便,改一次全项目生效。

利用宏定义简化硬件操作

在嵌入式开发中,有些硬件配置代码看起来差不多,只是寄存器地址或掩码不同。这时候可以用宏来统一格式:

#define SET_PIN_MODE(port, pin, mode)  do { \
    if (mode == OUTPUT) { \
        *(port + DDR_OFFSET) |= (1 << pin); \
    } else { \
        *(port + DDR_OFFSET) &= ~(1 << pin); \
    } \
} while(0)

这样在初始化多个IO口时,只需要一行调用,不用反复写类似的位操作。

使用头文件管理共享逻辑

如果多个源文件都要用到相同的配置参数或工具函数,把这些内容移到一个公共头文件里。比如 hardware_utils.h 放常用函数声明和结构体定义,对应 c 文件实现具体逻辑。编译时链接进去,避免每个文件都复制一遍。

条件编译处理平台差异

有时候看似重复的代码,其实是为不同硬件版本写的。比如老款主板用 I2C 地址 0x48,新款改成 0x49。与其复制两套代码,不如用条件编译控制:

#ifdef BOARD_V1
    #define SENSOR_ADDR 0x48
#else
    #define SENSOR_ADDR 0x49
#endif

// 后面统一使用 SENSOR_ADDR
init_sensor(SENSOR_ADDR);

这样代码只保留一份,通过编译选项切换硬件适配,干净又安全。

借助构建脚本生成重复代码

某些场景下,重复是因为要为多个同类设备生成配置项。比如系统要支持 8 路继电器,每路都有开启、关闭、状态查询函数。手动写八遍太累,可以写个 Python 脚本自动生成模板代码,在编译前运行,既减少出错也方便扩展。