使用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.h
( time.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