【发布时间】:2010-02-05 11:35:03
【问题描述】:
这是一个更大项目的缩减示例。你可以看到它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。
【问题讨论】: