在time.h中解决timespec的重新定义

时间:2013-12-24 11:01:37

标签: c linux linux-kernel

我正在编写一个包含/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 */
}; 

似乎这些定义确实相同,但我无法证明。

我的问题是:有没有一种可靠的方法来解决这种重新定义问题?

对此问题讨论的链接也非常感谢。感谢。

2 个答案:

答案 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)

我在Ecliepse Neon IDE中遇到了同样的错误,我通过在C / C ++ Build中添加 -DHAVE_STRUCT_TIMESPEC 来解决它 - &gt;设置 - &gt; GCC C ++编译器 - &gt;其他 - &gt;其他国旗

enter image description here