【问题标题】:resolving redefinition of timespec in time.h在 time.h 中解决 timespec 的重新定义
【发布时间】:2013-12-24 11:01:36
【问题描述】:

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

看来这些定义确实是等价的,但我无法证明。

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

也非常感谢您提供有关此问题的讨论链接。谢谢。

【问题讨论】:

  • 我认为你错误地包含了两个标题:/usr/include/linux/time.h 似乎是用于内核模块的。
  • 为什么要包含<linux/time.h>???
  • @Liviu 感谢您的关注。我的程序正在尝试通过利用 Linux 本机 AIO 在磁盘和网络 io 之间以协作优先级进行多路复用。等它稳定后,我会在 github 上发布它。看来要使用AIO接口,头文件是免不了的。你觉得怎么样?
  • @alk 感谢您的关注。请看我上面的评论。我说的对吗?
  • @Hatrick 不是 Linux 专家,但我认为如果您构建内核模块,则包含“/usr/include/linux/time.h”,否则包含“/usr/include/时间.h”。这不是关于某个界面,而是关于包含两个不同用途的标头。

标签: c linux linux-kernel


【解决方案1】:

解决双定义错误的一种方法是重命名以下定义之一:

#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];

【讨论】:

  • 绝招!整洁而强大!感谢绝地叶果鲁希金!愿原力与你同在。
  • 这个断言是如何工作的?这只是在条件为假的情况下强制编译错误的一种方式吗?如果是这样,为什么不直接使用普通断言(即通过 assert.h)?
  • @AlexQuinn 这是一个编译时断言,C++-11 之前的static_assert。 stackoverflow.com/a/14621998/412080
【解决方案2】:

我在 Ecliepse Neon IDE 中遇到了同样的错误,我通过在 C/C++ Build -> Settings -> GCC C++ Compiler -> Miscellaneous -> Others flag 中添加 -DHAVE_STRUCT_TIMESPEC 解决了它

【讨论】:

    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多