我不得不将应用程序从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
我在这里包含的文件。我错过了什么?
答案 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。