我正在编写一个包含/usr/include/linux/time.h
和/usr/include/stdlib.h.
问题是:
stdlib.h
包含/usr/include/time.h
,其中定义了“struct timespec'
”,/usr/include/linux/time.h
也定义了一个。这引入了重新定义的编译错误。
我已经检查了这两个头文件中'struct timespec'
的定义:
在/usr/include/time.h中:
struct timespec
{
__time_t tv_sec; /* Seconds. */
long int tv_nsec; /* Nanoseconds. */
};
/usr/include/linux/time.h中的:
struct timespec {
__kernel_time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
似乎这些定义确实相同,但我无法证明。
我的问题是:有没有一种可靠的方法来解决这种重新定义问题?
对此问题讨论的链接也非常感谢。感谢。
答案 0 :(得分:3)
解决双重定义错误的一种方法是重命名以下定义之一:
#include <time.h>
#define timespec linux_timespec
#include <linux/time.h>
#undef timespec
然后在编译时断言两个定义具有相同的布局:
typedef int assert_same_size[sizeof(struct linux_timespec) == sizeof(timespec) ? 1 : -1];
typedef int assert_same_alignment[__alignof(struct linux_timespec) == __alignof(timespec) ? 1 : -1];
typedef int assert_same_tv_sec[offsetof(struct linux_timespec, tv_sec) == offsetof(struct timespec, tv_sec) ? 1 : -1];
typedef int assert_same_tv_nsec[offsetof(struct linux_timespec, tv_nsec) == offsetof(struct timespec, tv_nsec) ? 1 : -1];
答案 1 :(得分:0)