Ошибка переопределения Timespec
При выполнении программы Pthread на C с использованием Visual Studio 2015 я получил следующую ошибку:
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
Заголовочный файл содержит следующий код, связанный с 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 */
Никакой другой заголовочный файл, который я использую, не использует timespec
структура, так что нет никаких шансов переопределить. Вероятность повреждения поврежденного заголовочного файла отсутствует, поскольку он был загружен с веб-сайта pthread с открытым исходным кодом.
1 ответ
pthreads-win32 (который я предполагаю, что вы используете) может внутренне включать time.h
(time.h
также обычно включается другими библиотеками / заголовками) - и time.h
уже заявляет timespec
(также, это совместимо с pthreads) - все же pthreads-win32's pthread.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