web-dev-qa-db-fra.com

Erreur de redéfinition de Timespec

Lors de l'exécution d'un programme Pthread en C à l'aide de Visual Studio 2015, j'ai eu l'erreur suivante:

Error C2011 'timespec': 'struct' type redefinition

Voici mon code:

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

Le pthread.h le fichier d'en-tête contient le code suivant lié à timepec:

#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 */

Aucun autre fichier d'en-tête que j'utilise n'utilise la structure timespec, il n'y a donc aucune chance de redéfinition. Il n'y a aucune chance qu'un fichier d'en-tête soit corrompu car il a été téléchargé depuis le site Web pthread opensource.

14
Vijay Manohar

pthreads-win32 (que je suppose que vous utilisez) peut inclure en interne time.h (time.h est également couramment inclus par d'autres bibliothèques/en-têtes) - et time.h déclare déjà timespec (aussi, il le fait d'une manière compatible avec pthreads) - mais le pthread.h de pthreads-win32 ne le fait pas ayez les gardes d'inclusion valides pour ce cas (honte à eux!). pthreads essaie de le déclarer car il en a besoin en interne, mais comme il est possible qu'il n'ait pas besoin de l'intégralité de time.h, il essaie de déclarer uniquement le timespec si possible. Pourtant, vous pouvez simplement ajouter

#define HAVE_STRUCT_TIMESPEC

avant #include <pthread.h> - cela indiquera à l'en-tête pthreads-win32 que vous avez déjà un timespec correct et laissera votre code se compiler correctement.

Alternativement, si vous utilisez largement pthreads, vous souhaiterez peut-être éditer le fichier d'en-tête lui-même - ajoutez simplement #define HAVE_STRUCT_TIMESPEC À lui quelque part vers le début, et vous êtes prêt à partir.

Pour en savoir plus: http://mingw-users.1079350.n2.nabble.com/mingw-error-redefinition-of-struct-timespec-td7583722.html

42
vaxquis