这是一个更大项目的缩减示例。你可以看到它here。
我有一个包含系统时间函数限制的头文件。称之为time_config.h。
#ifndef TIME_CONFIG_H
#define TIME_CONFIG_H
#define HAS_TIMEGM
#define SYSTEM_LOCALTIME_MAX 2147483647
#define SYSTEM_LOCALTIME_MIN -2147483648
#define SYSTEM_GMTIME_MAX 2147483647
#define SYSTEM_GMTIME_MIN -2147483648
const struct tm SYSTEM_MKTIME_MAX = { 7, 14, 19, 18, 0, 138, 0, 0, 0, 0, 0 };
const struct tm SYSTEM_MKTIME_MIN = { 52, 45, 12, 13, 11, 1, 0, 0, 0, 0, 0 };
#endif
然后是一个定义我的时间函数的头文件。叫它mytime.h。它包括time_config.h。
#ifndef MYTIME_H
#define MYTIME_H
#include "time_config.h"
#ifndef HAS_TIMEGM
time_t timegm(const struct tm*);
#endif
#endif
mytime.c包含mytime.h,并在必要时定义timegm()。
我把它编译成目标文件......
gcc <a lot of warning flags> -I. -c -o mytime.o mytime.c
并将其链接到测试二进制文件中,t / year_limit.t.c也包含mytime.h。
gcc <a lot of warning flags> -I. mytime.o t/year_limit.t.c -o t/year_limit.t
出了哪些错误:
ld: duplicate symbol _SYSTEM_MKTIME_MAX in /var/folders/eJ/eJzTVP7oG7GVsKYHJtMprE+++TI/-Tmp-//ccMe5DXb.o and mytime.o
collect2: ld returned 1 exit status
由于time_config.h是在构建过程中由系统探测器生成的,因此将所有值保存在一个头文件中,甚至多个头文件中都非常方便。在构建过程中更改.c文件更加困难。
没有结构就可以正常工作。如何在不导致此冲突的情况下在头文件中声明最小/最大日期结构?或者我编译和链接不正确?
PS这是ANSI C89。
答案 0 :(得分:5)
在标题(.h)中,您需要:
extern const struct tm SYSTEM_MKTIME_MAX;
extern const struct tm SYSTEM_MKTIME_MIN;
在您的实施(.c)中,您需要:
const struct tm SYSTEM_MKTIME_MAX = { 7, 14, 19, 18, 0, 138, 0, 0, 0, 0, 0 };
const struct tm SYSTEM_MKTIME_MIN = { 52, 45, 12, 13, 11, 1, 0, 0, 0, 0, 0 };
答案 1 :(得分:4)
const struct tm SYSTEM_MKTIME_MAX = { 7, 14, 19, 18, 0, 138, 0, 0, 0, 0, 0 };
以上声明并定义了对象SYSTEM_MKTIME_MAX
;标题的多个包含导致多个定义。
在标题中加入extern
并将定义放在实现文件中。
答案 2 :(得分:2)
在C常量中有外部链接,因此应在.c文件中定义。
在C ++中,它们具有内部链接,因此可以在标题中定义。
答案 3 :(得分:0)
标题必须只包含声明。所以将标题更改为:
extern const struct tm SYSTEM_MKTIME_MAX;
在cpp中进行作业
const struct tm SYSTEM_MKTIME_MAX = {...