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

📅 2026/7/13 20:47:28 👁️ 阅读次数 📝 编程学习
#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] = {...};

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