22

使用 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 开源网站下载的。

4

1 回答 1

57

pthreads-win32(我假设您正在使用)可能在内部包含time.htime.h通常也包含在其他库/头文件中)-并且time.h已经声明timespec(而且,它以与 pthreads 兼容的方式这样做)-但是 pthreads-win32pthread.h没有'没有针对这种情况的有效包含警卫(对他们感到羞耻!)。pthreads 尝试声明它,因为它在内部需要它,但由于它可能不需要整个time.h,因此它尝试仅在timespec可能的情况下声明它。不过,您可以简单地添加

#define HAVE_STRUCT_TIMESPEC

之前#include <pthread.h>- 这将告诉 pthreads-win32 标头您已经拥有一个正确的timespec,并将让您的代码正确编译。

或者,如果您广泛使用 pthreads,您可能希望编辑头文件本身 - 只需将其添加#define HAVE_STRUCT_TIMESPEC到靠近开头的某个位置,您就可以开始了。

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

于 2016-05-06T12:13:24.893 回答