18

我必须将应用程序从 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清楚地表明在我包含在这里timespec的头文件中找到了它。time.h我错过了什么?

4

5 回答 5

23

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

这应该有效:

#include <time.h>

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

    return 0;
}

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

于 2012-06-22T09:16:51.933 回答
3

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

于 2012-06-22T09:16:10.247 回答
2

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

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

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

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

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

注意:我在 Github issue 的某个地方找到了这个答案,所以我把它贴在这里。

于 2015-11-08T10:37:38.547 回答
2

这个问题给了我一段时间的问题,我最终做的是在我的代码中定义struct timespec 。(直接从 man 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;
}
于 2019-03-18T06:13:22.223 回答
2

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

于 2019-09-18T15:56:48.980 回答