当前位置: 首页 > news >正文

#86_【无标题】每次 .h 被 #include,就等于在所有包含它的 .c 文件中都复制了一份定义。

我在.h中定义了/CN:数码管段码表 (扫描引脚复用型)-- EN:Digital Tube Segment Code Table (Scan Pin Multiplexing Type)/
const uint8_t NUM_TAB[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
但是这个时候突然间报错了所以感觉有意思

错误原因

Error LNK:(1044) Symbol '_NUM_TAB' redefined.

你的NUM_TAB两个地方定义:

  1. T188.h第 37 行
constuint8_tNUM_TAB[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  1. 很可能在之前某个版本的Charge.c或其他文件中也有NUM_TAB的定义。虽然你当前提供的Charge.c我没看到,但根据对话历史,早期版本Charge.c中有:
constuint8_tNUM_TAB[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

链接器看到两个.o文件里都有NUM_TAB,就报重复定义了。


修复方法

T188.h,把:

constuint8_tNUM_TAB[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

改为声明(加extern,去掉初始化和长度):

externconstuint8_tNUM_TAB[10];

然后在T188.c全局变量区加上定义

constuint8_tNUM_TAB[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

为什么.h中定义不行?

每次.h#include,就等于在所有包含它的.c文件中都复制了一份定义。链接时多个.o都有同一个变量/常量,就冲突了。

规则

  • .h中只能放声明extern
  • .c中放定义(带初始化)

另外:g_Time_Tick还有问题

你现在的T188.h第 31 行:

bit g_Time_Tick;

没有extern这样还是定义,不是声明。仍然会导致被多个.c包含时重复定义。

必须改成

externbit g_Time_Tick;

然后在T188.c全局变量区加上:

bit g_Time_Tick=0;

汇总修改

文件修改前修改后
T188.h31bit g_Time_Tick;extern bit g_Time_Tick;
T188.h37const uint8_t NUM_TAB[10] = {...};extern const uint8_t NUM_TAB[10];
T188.c全局变量区加上bit g_Time_Tick = 0;const uint8_t NUM_TAB[10] = {...};

这样就能彻底解决重复定义的问题了。

http://www.jsqmd.com/news/785146/

相关文章:

  • 3个核心模块帮你零代码完成专业文本挖掘:KH Coder完全指南
  • Nixery与CI/CD集成:如何在流水线中实现按需镜像构建 [特殊字符]
  • 通过用量看板清晰观测各模型API调用成本与Token消耗
  • VADER框架:精准界定AI监管边界,避免传统技术被过度监管
  • 如何用jQuery Validation Plugin提升无人机数据采集表单的准确性:完整指南
  • Unix架构详细介绍
  • 基于LAMP环境的校园论坛项目
  • CANN/sip FFT1D示例
  • 3个实战场景深度解析:MagiskBoot工具在Android系统定制中的完整解决方案
  • CVAT工具的详细使用教程(视频标注)
  • AI+AR融合系统安全挑战与防御实践:从传感器污染到认知劫持
  • Ascend C开发工具包变更日志
  • natbot部署指南:如何快速配置本地与服务器环境的GPT-3浏览器控制工具
  • 1-论面向对象的建模及应用
  • Source Han Serif CN:构建专业中文排版系统的完整方案
  • mac 安装指定node版本
  • DAMAS框架:基于多智能体系统与ABM的分布式欺骗建模与分析
  • 2026年4月水处理工程推荐,反渗透水处理/去离子水处理/超纯水处理/生活污水处理/污水处理,水处理厂家推荐 - 品牌推荐师
  • CANN/runtime Kernel加载与执行
  • 为 Claude Code 配置 Taotoken 作为替代 API 服务商解决封号困扰
  • CubiFS分布式存储错误处理终极指南:10个最佳实践让数据安全无忧
  • 打造高可靠性WiFi中继器:esp_wifi_repeater看门狗定时器与故障恢复机制终极指南
  • AI系统安全实战:防御黑盒攻击与模型窃取的纵深策略
  • CANN/sip Cgemm复数矩阵乘法
  • 宁波地区专业的银行活动策划生产厂家找哪家 - GrowthUME
  • Linux Mem -- 通过reserved-memory缩减内存
  • 前端高级开发工程师面试准备一
  • 【GitHub】SuperClaude Framework深度解析:将Claude Code打造为专业开发平台的元编程配置框架
  • AI 术语通俗词典:偏导数
  • 量子机器学习新范式:Classiq如何简化QML模型开发