2015-11-06 12 views
6

Durante l'esecuzione di un programma Pthread in C utilizzando Visual Studio 2015, ho ottenuto il seguente errore:errore di ridefinizione timespec

Error C2011 'timespec': 'struct' type redefinition 

Quello che segue è il mio codice:

#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); 
} 

Il file di intestazione pthread.h contiene il codice seguente relativo a 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 */ 

Nessun'altra intestazione f ile che utilizzo utilizza la struttura timespec, quindi non c'è possibilità di ridefinizione. Non c'è possibilità di un file di intestazione corrotto perché è stato scaricato dal sito Web di pthread opensource.

+0

Quale linea si è verificato che l'errore su? – user3386109

+0

@ user3386109 non è indicato alcun numero di riga, quando faccio clic sull'errore si sta caricando quanto segue in pthreads cpp struct timespec { time_t tv_sec; long tv_nsec; }; –

+0

Gli errori hanno sempre nomi di file e numeri di riga. In ogni caso, direi che il file di progetto è corrotto o che i file di intestazione del sistema sono stati danneggiati. Nessuno dei quali può essere diagnosticato su Internet. – user3386109

risposta

20

pthreads-win32 (che presumo che si sta utilizzando) possono includere internamente time.h (time.h è anche comunemente compreso da altre biblioteche/header) - e time.h dichiara già timespec (anche, lo fa in modo compatibile con pthreads) - tuttavia i pthreads-win32 pthread.h non hanno le protezioni di inclusione valide per questo caso (vergognati!). pthreads prova a dichiararlo perché ne ha bisogno internamente, ma poiché è possibile non avrà bisogno dell'intero time.h, esso tenta di dichiarare solo il timespec se possibile. Ancora, si può semplicemente aggiungere

#define HAVE_STRUCT_TIMESPEC 

prima #include <pthread.h> - che racconterà l'intestazione pthreads-win32 che si dispone già di una vera e propria timespec, e vi permetterà di compilare il codice in modo corretto.

In alternativa, se si utilizza ampiamente pthreads, si potrebbe desiderare di modificare il file di intestazione stesso - basta aggiungere quello #define HAVE_STRUCT_TIMESPEC ad esso vicino all'inizio, e sei a posto.

Ulteriori approfondimenti: http://mingw-users.1079350.n2.nabble.com/mingw-error-redefinition-of-struct-timespec-td7583722.html

Problemi correlati