web-dev-qa-db-ja.com

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オープンソースWebサイトからダウンロードされているため、ヘッダーファイルが破損する可能性はありません。

14
Vijay Manohar

pthreads-win32(私があなたが使っていると思います)may内部的にtime.hを含みます(time.hは他のライブラリ/ヘッダー)-およびtime.hはすでにtimespecを宣言しています(また、pthreadと互換性のある方法で宣言しています)-しかし、pthreads-win32のpthread.hには有効なインクルードがありませんこの事件の警備員(彼らに恥をかかせる!)。 pthreadは内部で必要とするために宣言を試みますが、time.h全体を必要としない可能性があるため、可能であればtimespecのみを宣言しようとします。それでも、単に追加することができます

#define HAVE_STRUCT_TIMESPEC

before #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

42
vaxquis