我正在开发一种嵌入式系统,它提供了某些类型的接口。
问题是通过包含来自c标准库的某些标题我得到error: conflicting types
我使用gettimeofday
而我只使用struct timeval
,但是使用sys/time.h
time_t
也会阻碍系统定义的{{1}}。< / p>
我无法触及这些代码中的任何一个,我需要它们。
有没有办法解决这些问题? (我应该能够使用系统的声明类型和c头中声明的一些函数,包含已经由系统完成的一些声明的头文件。)
答案 0 :(得分:5)
您可以使用宏重命名time_t
typedef之一,而无需修改任何标题:
#define time_t LIBC_time_t
#include <sys/time.h>
#undef time_t
#include <header_which_defines_the_time_t_you_want.h>
这不能保证有效,但它确实在很多时候都有用。
答案 1 :(得分:2)
解决这个问题的一种方法,或多或少的最后手段是引入另一个抽象级别,并提供包装API来隔离麻烦的标题。
如果你有这样的事情:
my_file.c:
#include <sys/time.h>
#include <some_system_header.h>
void foo(void)
{
struct timeval tv;
gettimeofday(&tv);
....
}
变成
my_gettimeofday.c:
#include <sys/time.h> //only sys.time.h here, no system headers
#include "my_gettimeofday.h"
void my_gettimeofday(struct my_timeval *my_tv)
{
struct timeval tv;
gettimeofday(&tv);
my_tv->sec = tv.tv_sec;
my_tv->usec = tv.tv_usec;
}
my_gettimeofday.h:
struct my_timeval {
long sec, usec; //adjust to your platform if needed
};
void my_gettimeofday(struct my_timeval *my_tv);
my_file.c:
//no sys/time.h here.
#include <some_system_header.h>
#include "my_gettimeofday.h"
void foo(void)
{
struct my_timeval tv;
my_gettimeofday(&tv);
....
}
答案 2 :(得分:1)
如果只有一个函数(gettimeofday)和一个类型,在单独的源代码文件中构建一个'wrapper'函数,请为gettimeofday调用包含正确的头。
int my_gettimeofday(struct my_timeval *restrict tp, void *restrict tzp) {
timeval t;
t.time_t = my_timeval.time_t;
// ...
int ret = gettimeofday(&t, tzp);
my_timeval.time_t = t.time_t;
// .. copy the others
}
创建新类型struct my_timeval,该内容与正在发生冲突的内容相同。冲突已经分开了。
是吗?