Timespec重新定义错误

使用Visual Studio 2015在C中执行Pthread程序时,出现以下错误:

Error C2011 'timespec': 'struct' type redefinition 

以下是我的代码:

 #include<pthread.h> #include<stdlib.h> #include<stdio.h> void *calculator(void *parameter); int main(/*int *argc,char *argv[]*/) { pthread_t thread_obj; pthread_attr_t thread_attr; char *First_string = "abc"/*argv[1]*/; pthread_attr_init(&thread_attr); pthread_create(&thread_obj,&thread_attr,calculator,First_string); } void *calculator(void *parameter) { int x=atoi((char*)parameter); printf("x=%d", x); } 

pthread.h头文件包含以下与timespec相关的代码:

 #if !defined(HAVE_STRUCT_TIMESPEC) #define HAVE_STRUCT_TIMESPEC #if !defined(_TIMESPEC_DEFINED) #define _TIMESPEC_DEFINED struct timespec { time_t tv_sec; long tv_nsec; }; #endif /* _TIMESPEC_DEFINED */ #endif /* HAVE_STRUCT_TIMESPEC */ 

没有其他的头文件使用timespec结构,所以没有重新定义的机会。 没有机会损坏头文件,因为它已经从pthread开源网站下载。

pthreads-win32(我假设你正在使用) 可能内部包含time.htime.h也通常包含在其他库/头文件中) – 而time.h已经声明了timespec (同样,它也是以兼容的方式与pthreads) – 但pthreads-win32的pthread.h没有有效的包括这种情况下的守卫(羞辱他们!)。 pthreads尝试声明它,因为它在内部需要它,但是因为它可能不需要整个time.h ,所以它试图只声明timespec如果可能的话)。 不过,你可以简单地添加

 #define HAVE_STRUCT_TIMESPEC 

#include <pthread.h>之前 – 这将告诉pthreads-win32头文件,你已经有了一个合适的timespec ,并且可以让你的代码正确编译。

或者,如果您广泛使用pthread,则可能希望编辑头文件本身 – 只需将#define HAVE_STRUCT_TIMESPEC添加到开头附近的某个位置,即可。

详细阅读: http : //mingw-users.1079350.n2.nabble.com/mingw-error-redefinition-of-struct-timespec-td7583722.html