IAR ERROR --- [Li006]
今天移植代码时遇到一个比较奇葩的问题,记录如下:
Error[Li006]: duplicate definitions for "Uart3"; in "E:\IAR_1768Pro_PCB799\Debug\Obj\Uart3_init.o", and "E:\IAR_1768Pro_PCB799\Debug\Obj\uModemG600.o"
重复定义 变量 Uart3
可是,uModemG600.c 文件中没有 Uart3 这个变量 ,只有 uart3.h 这个头文件,问题就出现在在这头文件中。
Uart3 这个变量的定义就放在 uart3.h 中,而且 uart3.h 在uart3.c 和 uModemG600.c 中都有#include , uart3.h 也未做条件编译,导致uart3.h 重复编译, 变量重复定义。
//===================问题描述完毕,一下是个人观点======================
我个人的做法是,变量/函数 定义在 *.c 文件中,变量/函数声明在 *.h 文件中, 并且 *.h 文件加编译条件,放置重复包含,格式如下:
user.c
1 //user.c file 2 3 #include <stdio.h> 4 #include <string.h> 5 #include "user.h" 6 7 signed char g_a = 0; 8 unsigned char g_b = 0; 9 signed int g_c = 0; 10 11 void fun1(void) 12 { 13 //do something 14 } 15 16 void fun2(void) 17 { 18 //do something 19 }
user.h
#ifndef _USER_H_ #define _USER_H_ extern signed char g_a; extern unsigned char g_b; extern signed int g_c; void fun1(void); void fun2(void); #endif
whatever is worth doing is worth doing well...