Ошибка переопределения 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

Другие вопросы по тегам