【问题标题】:timespec not found in time.h在 time.h 中找不到 timespec
【发布时间】:2012-06-24 14:00:11
【问题描述】:

我必须将应用程序从 C++ 重写为 C。我在 Ubuntu 12.04 上使用 gcc 和 Eclipse。在这样做时我遇到了这个错误

../src/TTNoddy.c: In function ‘main’:
../src/TTNoddy.c:16:2: error: unknown type name ‘timespec’

这是我重现问题的代码 sn-p

#include <time.h>

int main(void) {

    timespec TS;
    TS.tv_nsec = 1;

    return 0;
}

我在这里感到困惑 - 我是一名 C++ 编码员,在我的生活中从未编写过纯 C 应用程序,但 clock_gettime 的手册页清楚地表明 timespec 在我的 time.h 头文件中找到包括这里。我错过了什么?

【问题讨论】:

    标签: c struct


    【解决方案1】:

    timespec 是一个struct,你需要明确地告诉编译器这个。如果您仔细阅读手册页,您会看到它是这样说明的。

    这应该可行:

    #include <time.h>
    
    int main(void) {
        struct timespec TS;
        TS.tv_nsec = 1;
    
        return 0;
    }
    

    附加说明:如果已将其定义为typedef struct,则无需手动添加struct 部分。但是,您应该假设大多数/所有纯 C 结构都没有定义为 typedef

    【讨论】:

    • 谢谢。我知道它是一个结构,它只是来自我的代码工作的 C++ 我从来不知道你必须先用 struct 显式声明每个 timespec。我想我会发现很多不同之处。
    • 另请注意,timespec 不是 C89/C99 的一部分,而是 POSIX。 stackoverflow.com/questions/3875197/std-c99-wtf-on-linux
    • 实际上我的 mingw32 编译器根本没有在 time.h 中定义 timespec。而是 pthread.h
    【解决方案2】:

    它不应该只是 timespec,因为 timespec 是一个结构。应该是struct timespec。请相应地修改您的代码。

    【讨论】:

      【解决方案3】:

      尝试在 Visual Studio 2015 下编译工作项目时出现此错误。

      解决方案是将HAVE_STRUCT_TIMESPEC 添加到预处理器定义中。

      通过 GUI: 项目属性(pan)> 属性页(图标)> 配置属性 > C/C++ > 预处理器 > 预处理器定义 > 编辑 > 添加HAVE_STRUCT_TIMESPEC

      或手动:编辑每个项目文件并将&lt;PreprocessorDefinitions&gt; 的每个实例(每个文件可以有多个)替换为:

      <PreprocessorDefinitions>HAVE_STRUCT_TIMESPEC;WIN32;__GNU_LIBRARY__;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      

      注意:我找到了这个答案somewhere on a Github issue,所以我把它贴在这里。

      【解决方案4】:

      这个问题给我带来了一段时间的问题,我最终做的是在我的代码中定义 struct timespec。 (刚刚复制过来,直接来自 nanosleep)

      #include <time.h>
      
      struct timespec {
          time_t tv_sec;        /* seconds */
          long   tv_nsec;       /* nanoseconds */
      };
      
      int main(void) {
          struct timespec TS;
          TS.tv_nsec = 1;
      
          return 0;
      }
      

      【讨论】:

      • 把它包裹在一个命名空间中,它会尽可能的优雅。
      【解决方案5】:

      我知道这是一个老问题,但从 gcc 6.3 升级到 7.1 后我遇到了同样的问题。查看更改后,您必须定义 _GNU_SOURCE 以包含 struct_timespec.h。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-09
        • 1970-01-01
        • 2019-08-16
        • 2015-08-18
        • 2015-06-06
        • 2015-09-02
        • 2015-09-25
        相关资源
        最近更新 更多