timepec在time.h中找不到

时间:2012-06-22 09:13:43

标签: c struct

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

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

这是我的代码片段,可以重现问题

    #include <time.h>

    int main(void) {

        timespec TS;
        TS.tv_nsec = 1;

        return 0;
    }

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

5 个答案:

答案 0 :(得分:20)

timespec是struct,你需要明确地告诉编译器。如果您仔细阅读手册页,您可以看到它已经说明了。

这应该有效:

#include <time.h>

int main(void) {
    struct timespec TS;
    TS.tv_nsec = 1;

    return 0;
}

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

通过GUI:项目属性(平移)&gt;属性页面(图标)&gt;配置属性&gt; C / C ++&gt;预处理器&gt;预处理器定义&gt;编辑&gt;添加HAVE_STRUCT_TIMESPEC

或手动:编辑每个项目文件并替换<PreprocessorDefinitions>的每个实例(每个文件可以有几个),例如:

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

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

答案 3 :(得分:1)

这个问题给了我一段时间的麻烦,我最终要做的是在代码中定义 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;
}

答案 4 :(得分:1)

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