While executing a Pthread program in C using Visual Studio 2015, I got the following error:
Error C2011 ‘timespec’: ‘struct’ type redefinition
The following is my 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);
}
Rachid K.
4,1323 gold badges10 silver badges29 bronze badges
asked Oct 14, 2015 at 0:00
1
Add this compiler flag:
-DHAVE_STRUCT_TIMESPEC
answered Nov 16, 2015 at 10:56
user_0user_0
3,09820 silver badges32 bronze badges
1
Despite this question is already answered correctly, there is also another way to solve this problem.
First, problem occurs because pthreads-win32
internally includes time.h
which already declares timespec struct
.
To avoid this error the only thing we should do is this:
#define HAVE_STRUCT_TIMESPEC
#include <pthread.h>
answered Apr 7, 2018 at 8:15
NutCrackerNutCracker
11k2 gold badges41 silver badges68 bronze badges
The same problem happens when compiling programs in Visual Studio 2015 that include MariaDB 10 header files (saw it with 10.1.14).
The solution there is to define the following:
STRUCT_TIMESPEC_HAS_TV_SEC
STRUCT_TIMESPEC_HAS_TV_NSEC
answered Jun 3, 2016 at 8:36
Joao CostaJoao Costa
2,4831 gold badge21 silver badges14 bronze badges
On Visual Studio 2015.
I solve the problem adding:
#define _TIMESPEC_DEFINED
answered Nov 8, 2019 at 4:01
Delete all instances of ‘TIMESPEC’ in pthread.h (Make a backup first.)
If I understand it correctly, you probably downloaded pthreads and tried installing it into your VS.
But the pthreads.h file doesn’t play nicely with the TIMESPEC defintions already defined in some other header file.
So, delete the portions of the pthreads.h file where TIMESPEC is defined.
answered Nov 7, 2015 at 21:40
2
Everything was working well untill I moved some code from the main file to a new class, then I had the following error:
error C2011: ‘color1’ : ‘struct’ type redefinition
struct color1
{
color1()
{
red = green = blue = 0;
}
color1(float _red, float _green, float _blue)
{
red = _red;
green = _green;
blue = _blue;
}
float red, green, blue;
};
Any idea ?
asked Apr 28, 2011 at 21:12
HomamHomam
23k32 gold badges108 silver badges187 bronze badges
4
If the compiler says it’s redefined, then it probably is.
My psychic debugging skills tell me that you moved the struct from a source file to a header file, and forget the include guards in that header, which is then included multiple times in a source file.
EDIT: As a general rule I generally suggest avoiding leading underscores. In some cases (for example followed by a capital letter) they’re reserved for the implementation and it’s simplest to just never use leading _
instead of hoping you remember all the rules.
answered Apr 28, 2011 at 21:14
Mark BMark B
94.3k10 gold badges107 silver badges185 bronze badges
2
From snippet above I can’t deduce something is wrong.
But typically this error means that you are including same header files multiple times. Don’t you forget to add standard guards for include files?
#ifndef MY_HEADER_FILE_
#define MY_HEADER_FILE_
// here is your header file code
#endif
answered Apr 28, 2011 at 21:16
beduinbeduin
7,7533 gold badges26 silver badges24 bronze badges
1
You can have the definition of the structure on a header file.
Have
#pragma once
at the beginning of the header where the struct is defined, it solves the problem.
answered Nov 2, 2016 at 18:54
Jake OPJJake OPJ
3412 silver badges8 bronze badges
I had the same problem and luckily did not take long figure out that it was just a silly mistake.
The thing was that I had a backup of my project at another drive (D:) but all the code was set on the drive C: when explicitly defined the full path. I created it on the C: path and was always using that way, but accidentally opened the project from the D and thought that it was the same thing, so at compile it was including twice because in some cases it was including the code from the C: path and at others from the D: path.
answered Oct 7, 2019 at 13:07
ChrCury78ChrCury78
4073 silver badges7 bronze badges
I had the same problem too, and it turned out that I made a mistake with my header guard. For example, instead of writing:
#ifndef COMMAND_H
#define COMMAND_H
// My code
#endif // COMMAND_H
I made a little and hard to recognize typo:
#ifndef COMNAND_H
#define COMMAND_H
// My code
#endif // COMMAND_H
That is, COMNAND_H not COMMAND_H. It should be the letter M rather than the letter N. I fixed that and everything was fine. Hope this answer help you with your case!!!
answered Jun 17, 2021 at 8:19
Everything was working well untill I moved some code from the main file to a new class, then I had the following error:
error C2011: ‘color1’ : ‘struct’ type redefinition
struct color1
{
color1()
{
red = green = blue = 0;
}
color1(float _red, float _green, float _blue)
{
red = _red;
green = _green;
blue = _blue;
}
float red, green, blue;
};
Any idea ?
asked Apr 28, 2011 at 21:12
HomamHomam
23k32 gold badges108 silver badges187 bronze badges
4
If the compiler says it’s redefined, then it probably is.
My psychic debugging skills tell me that you moved the struct from a source file to a header file, and forget the include guards in that header, which is then included multiple times in a source file.
EDIT: As a general rule I generally suggest avoiding leading underscores. In some cases (for example followed by a capital letter) they’re reserved for the implementation and it’s simplest to just never use leading _
instead of hoping you remember all the rules.
answered Apr 28, 2011 at 21:14
Mark BMark B
94.3k10 gold badges107 silver badges185 bronze badges
2
From snippet above I can’t deduce something is wrong.
But typically this error means that you are including same header files multiple times. Don’t you forget to add standard guards for include files?
#ifndef MY_HEADER_FILE_
#define MY_HEADER_FILE_
// here is your header file code
#endif
answered Apr 28, 2011 at 21:16
beduinbeduin
7,7533 gold badges26 silver badges24 bronze badges
1
You can have the definition of the structure on a header file.
Have
#pragma once
at the beginning of the header where the struct is defined, it solves the problem.
answered Nov 2, 2016 at 18:54
Jake OPJJake OPJ
3412 silver badges8 bronze badges
I had the same problem and luckily did not take long figure out that it was just a silly mistake.
The thing was that I had a backup of my project at another drive (D:) but all the code was set on the drive C: when explicitly defined the full path. I created it on the C: path and was always using that way, but accidentally opened the project from the D and thought that it was the same thing, so at compile it was including twice because in some cases it was including the code from the C: path and at others from the D: path.
answered Oct 7, 2019 at 13:07
ChrCury78ChrCury78
4073 silver badges7 bronze badges
I had the same problem too, and it turned out that I made a mistake with my header guard. For example, instead of writing:
#ifndef COMMAND_H
#define COMMAND_H
// My code
#endif // COMMAND_H
I made a little and hard to recognize typo:
#ifndef COMNAND_H
#define COMMAND_H
// My code
#endif // COMMAND_H
That is, COMNAND_H not COMMAND_H. It should be the letter M rather than the letter N. I fixed that and everything was fine. Hope this answer help you with your case!!!
answered Jun 17, 2021 at 8:19
Содержание
- Visual Studio 2019: «error C2011: ‘timespec’: ‘struct’ type redefinition» in threads_windows.h #755
- Comments
- ошибка C2011: переопределение типа ‘member’: ‘struct’ при перемещении структуры в новый заголовочный файл
- Решение
- Другие решения
- Русские Блоги
- C ++ использует решение ошибки pthread под Windows
- Каталог статей
- 1. Не удается найти ошибку pthread.h в заголовочном файле.
- 2. «timespec»: переопределение типа «struct»
- 3. Отсутствует pthreadVC2.dll.
- Четыре неразрешимых внешних команды
- ошибка C2011: «member»: переопределение типа «struct» при перемещении структуры в новый файл заголовка
- 3 ответы
- Русские Блоги
- Ошибка компиляции при использовании pthread win32 под Visual Studio 2015
- Решение 1
- Решение 2
- Интеллектуальная рекомендация
- Реализация оценки приложения iOS
- JS функциональное программирование (е)
- PWN_JarvisOJ_Level1
- Установка и развертывание Kubernetes
- На стороне многопроцессорного сервера — (2) *
Visual Studio 2019: «error C2011: ‘timespec’: ‘struct’ type redefinition» in threads_windows.h #755
This library is included in https://github.com/Ableton/push2-display-with-juce
i have cloned it to make it work with new JUCE and Visual Studio2019, seems Ableton have decided not to support it.
https://github.com/jpnielsen/push2-display-with-juce
When building in VS2019 community edition, i get this error:
1>C:Usersjpnsourcerepospush2-display-with-jucemoduleslibusblibusblibusb.h(900,28): warning C4099: ‘libusb_device_handle’: type name first seen using ‘class’ now seen using ‘struct’ (compiling source file ….Sourcepush2Push2-Usb-Communicator.cpp) 1>C:Usersjpnsourcerepospush2-display-with-juceSourcepush2Push2-UsbCommunicator.h(35): message : see declaration of ‘libusb_device_handle’ (compiling source file ….Sourcepush2Push2-Usb-Communicator.cpp) 1>C:Usersjpnsourcerepospush2-display-with-jucemoduleslibusblibusblibusb.h(970,57): warning C4099: ‘libusb_device_handle’: type name first seen using ‘class’ now seen using ‘struct’ (compiling source file ….Sourcepush2Push2-Usb-Communicator.cpp) 1>C:Usersjpnsourcerepospush2-display-with-jucemoduleslibusblibusblibusb.h(900): message : see declaration of ‘libusb_device_handle’ (compiling source file ….Sourcepush2Push2-Usb-Communicator.cpp) 1>C:Usersjpnsourcerepospush2-display-with-jucemoduleslibusblibusblibusb.h(1191,23): warning C4099: ‘libusb_transfer’: type name first seen using ‘class’ now seen using ‘struct’ (compiling source file ….Sourcepush2Push2-Usb-Communicator.cpp) 1>C:Usersjpnsourcerepospush2-display-with-juceSourcepush2Push2-UsbCommunicator.h(34): message : see declaration of ‘libusb_transfer’ (compiling source file ….Sourcepush2Push2-Usb-Communicator.cpp) 1>C:Usersjpnsourcerepospush2-display-with-jucemoduleslibusblibusblibusb.h(1202,74): warning C4099: ‘libusb_transfer’: type name first seen using ‘class’ now seen using ‘struct’ (compiling source file ….Sourcepush2Push2-Usb-Communicator.cpp) 1>C:Usersjpnsourcerepospush2-display-with-jucemoduleslibusblibusblibusb.h(1191): message : see declaration of ‘libusb_transfer’ (compiling source file ….Sourcepush2Push2-Usb-Communicator.cpp) 1>C:Usersjpnsourcerepospush2-display-with-jucemoduleslibusblibusblibusb.h(1210,24): warning C4099: ‘libusb_transfer’: type name first seen using ‘class’ now seen using ‘struct’ (compiling source file ….Sourcepush2Push2-Usb-Communicator.cpp) 1>C:Usersjpnsourcerepospush2-display-with-jucemoduleslibusblibusblibusb.h(1210): message : see declaration of ‘libusb_transfer’ (compiling source file ….Sourcepush2Push2-Usb-Communicator.cpp) 1>libusb_platform_wrapper.c 1>C:Usersjpnsourcerepospush2-display-with-jucemoduleslibusblibusbosthreads_windows.h(40,17): error C2011: ‘timespec’: ‘struct’ type redefinition 1>C:Program Files (x86)Windows Kits10Include10.0.18362.0ucrttime.h(39): message : see declaration of ‘timespec’ 1>Done building project «juce2push2.vcxproj» — FAILED. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
I added to moduleslibusblibusbosthreads_windows.h
and the build finishes without errors
I found some references, but don’t know how to fix proper.
The text was updated successfully, but these errors were encountered:
Источник
ошибка C2011: переопределение типа ‘member’: ‘struct’ при перемещении структуры в новый заголовочный файл
У меня был файл .h с некоторым кодом класса — overlay.h
Теперь я переместил структуру в другой новый файл с именем member.h
и включил этот файл, чтобы мой класс overlay_server мог его использовать.
Теперь, когда я собираю программу, я получаю ошибку.
Какие изменения я должен сделать, чтобы сделать эту работу?
Я читал о средствах защиты заголовков на SO, но не мог понять, как реализовать это здесь для решения проблемы.
У меня нет переопределения структуры где-либо.
У меня есть другой класс с именем overlay_client, он также использует struct member.
В моей основной функции я создаю объекты как overlay_server, так и overlay_client.
Теперь моя программа запускается только в том случае, если member.h включен в overlay_server.h (хотя этого требует код как в overlay_server, так и в overly_client)
если он включен в оба, то я получаю ошибку переопределения
Решение
Вы также можете использовать pragma и получить тот же эффект. На вершине все ваши заголовочные файлы, напишите:
И способ использования стражей включений заключается в том, чтобы окружить все содержимое файла заголовка включенной защитой, которая выглядит следующим образом:
Теперь, выбирая разумное имя вместо SOME_SYMBOL является очень важно. Большинство программистов делают защитное имя на основе имени файла (а также пути и имени проекта и названия компании / отдельного лица.) Например, для заголовка с именем «some_header.h» (или «SomeHeader.h»), расположенного в «[root проекта ] / include / myproject «, вы бы назвали имя охранника __INCLUDE__MY_PROJECT__SOME_HEADER_H__ , Но это всего лишь предложение; подойдет любой уникальный символ.
Вы также можете объединить pragma и включают охранников (потому что pragma метод Можно улучшить время компиляции в очень больших проектах, но не все компиляторы его поддерживают.) Если вы хотите их обоих, напишите:
Это не имеет негативных последствий (насколько мне известно), только возможность предотвратить ошибки сборки и ускорить сборку (в больших проектах). Но обратите внимание, что значения включают в себя защиту и #pragma once являются не точно так же. В очень очень редких случаях вам нужно будет использовать один или другой, или ни того, ни другого.
Другие решения
Это то, что происходит.
у тебя есть
включен в overlay_server.h И в overlay_client.h
теперь, когда вы включите эти два в main.cpp
это как вы делаете это в main.cpp (на самом деле препроцессор раскрывается как показано ниже)
так что обычно будет так после полного расширения
поэтому компилятор разбирает его как два определения struct member (потому что он дважды посетит member.h и прочитает определение структуры члена).
что делать, чтобы этого избежать
в member.h добавить это
теперь в основном у вас будет это
Если overlay.h содержит struct member определение и member.h также имеет struct member определение, вы не можете включить member.h от overlay.h , Вот как работают охранники:
Обратите внимание на #ifndef _H__MEMBER_ а также #define _H__MEMBER_ а также #endif , С включенной защитой, он гарантирует, что ваш заголовок включен только один раз, потому что после первого включения ЧАС_MEMBER_ будет уже определен, поэтому он пропустит определение. Ваше соглашение об именах может быть другим, но обычно я делаю что-то вроде _H__ _ как мой определяет.
Источник
Русские Блоги
C ++ использует решение ошибки pthread под Windows
Каталог статей
1. Не удается найти ошибку pthread.h в заголовочном файле.
Если pthread не загружен, в проекте #include
Произойдет ошибка, заключающаяся в том, что файл заголовка не может быть найден.В настоящее время вам необходимо загрузить пакет разработки pthread с официального сайта.Официальный адрес сайта, соответствующиеСсылка для скачивания, Загрузите сжатый пакет внутриpthreads-w32-2-9-1-release.zip。
Получить папку после распаковки
Поместите include и lib в папку Pre-built.2 в каталог загрузки VS. Мой каталогC:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.11.25503, А затем вставьте папки include и lib и объедините их.Когда вы перейдете к VS, вы обнаружите, что он успешно включил файл заголовка.
2. «timespec»: переопределение типа «struct»
Это связано с тем, что структура timespec была определена в time.h, а такая же структура определена в pthread.h. В этот раз мы можем добавить операторы в начало pthread.h #define HAVE_STRUCT_TIMESPEC Это решаемо.
3. Отсутствует pthreadVC2.dll.
Это связано с тем, что библиотека динамической компоновки pthread отсутствует под Windows, нам нужно распаковать пакет .pthreads-w32-2-9-1-releasePre-built.2dllx86pthreadVC2.dll Место в C:WindowsSysWOW64 Решается скачиванием.
Если вы поместите x64 pthreadVC2.dll в папку dll в пакете распаковки, произойдет ошибка
Приложение не запускается нормально 0xc000007b решение
Четыре неразрешимых внешних команды
Добавить предложения в файл проекта #pragma comment(lib, «pthreadVC2.lib») Это решаемо.
Вы можете увидеть информацию о выводе окна.
Источник
ошибка C2011: «member»: переопределение типа «struct» при перемещении структуры в новый файл заголовка
У меня был файл .h с некоторым кодом класса — overlay.h
Теперь я переместил структуру в другой новый файл с именем member.h и включил этот файл, чтобы мой класс overlay_server мог его использовать. Теперь, когда я создаю программу, я получаю сообщение об ошибке.
Какие изменения я должен внести, чтобы это заработало? Я читал о защите заголовков на SO, но не мог понять, как это реализовать здесь, чтобы решить проблему.
У меня нигде нет переопределения структуры. У меня есть другой класс с именем overlay_client, он также использует член структуры.
В моей основной функции я создаю объекты как overlay_server, так и overlay_client. Теперь моя программа запускается только в том случае, если member.h включен в overlay_server.h (хотя этого требует код как в overlay_server, так и в overly_client), если он включен в оба, тогда я получаю ошибку переопределения
задан 24 мая ’13, 04:05
Вы очищали решение, прежде чем восстановить его? — taocp
Какую ошибку вы получаете? — Lazylabs
Вероятно, ошибка в названии. — Brad
Вы перепутались с включенными охранниками или есть несколько определений? Кстати, где вы определили класс? и вы используете <> я думаю тебе лучше использовать «» для пользовательских заголовков — Koushik Shetty
Я еще не написал никаких включенных охранников — user494461
3 ответы
Вы также можете использовать pragma и получить тот же эффект. В верхней части все ваши заголовочные файлы, напишите:
И способ использования include guards заключается в том, чтобы окружить все содержимое заголовочного файла с помощью include guard, который выглядит следующим образом:
Теперь, выбрав осмысленное имя вместо SOME_SYMBOL is очень важно. Большинство программистов создают защитное имя на основе имени файла (а также пути и имени проекта и имени компании/частного лица). Например, для заголовка с именем «some_header.h» (или «SomeHeader.h»), расположенного в «[корень проекта ]/include/myproject», вы бы назвали имя охранника __INCLUDE__MY_PROJECT__SOME_HEADER_H__ . Но это всего лишь предложение; подойдет любой уникальный символ.
Вы также можете комбинировать pragma и включить охранников (потому что pragma метод может улучшите время компиляции в очень больших проектах, но не все компиляторы его поддерживают.) Если вам нужны оба варианта, вы должны написать:
Это не имеет неблагоприятных последствий (насколько мне известно), только потенциально может предотвратить ошибки сборки и ускорить ваши сборки (в больших проектах). Но обратите внимание, что значения включают охранников и #pragma once Он не точно так же. В очень-очень редких случаях вам нужно будет использовать один или другой или ни один из них.
ответ дан 24 мая ’13, 05:05
Вот что происходит. у вас есть
включены в overlay_server.h и в overlay_client.h
теперь, когда вы включаете эти два в main.cpp
это похоже на то, что вы делаете это в main.cpp (на самом деле препроцессор расширяется, как показано ниже)
так что обычно это будет так после полного расширения
поэтому компилятор анализирует его как два определения struct member (потому что он дважды посетит member.h и прочитает определение структуры члена).
что делать, чтобы избежать этого
в member.h добавьте это
теперь в основном у вас будет это
ответ дан 24 мая ’13, 05:05
If overlay.h содержит struct member определение и member.h также имеет struct member определение, вы не можете включить member.h от overlay.h . Вот как работают охранники включения:
Обратите внимание, что #ifndef _H__MEMBER_ и #define _H__MEMBER_ и #endif . С включенными охранниками он гарантирует, что ваш заголовок будет включен только один раз, потому что после первого раза он включен. H_MEMBER_ будет уже определен, поэтому определение будет пропущено. Ваше соглашение об именах может быть другим, но обычно я делаю что-то вроде _H__ _ как мое определяет.
ответ дан 24 мая ’13, 05:05
Что касается вашего «Почему?». Вы получаете ошибку переопределения, поскольку дважды включили одно и то же определение. Охранники заголовков предотвращают это. Также иногда вы можете просто поместить член структуры; например, в overly_client.h, а затем #include в overlay_client.cpp — штифтик
@Brad Почему вы ставите охрану включения после #include заявления? Есть ли причина? Насколько я могу судить, это только замедляет сборку, потому что компилятору, вероятно, придется открывать эти включенные файлы только для того, чтобы столкнуться с дополнительными охранниками включения, закрыть файлы и оставить их. Почему бы не поставить #include отчетность внутри включая охранников? — yzt
@yzt, вы делаете хорошее замечание, я думаю, я просто поместил охранники под включениями для удобочитаемости — мне всегда нравится, чтобы мои включения были в самом верху файла. Это скорее личный выбор, где вы ставите включенные охранники. — штифтик
@Брэд, я думаю, положить #include операторы за пределами защиты заголовка могут иметь ощутимое влияние на время компиляции в больших проектах. По этой причине я не думаю, что это вопрос личного вкуса и выбора. — yzt
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c++ boost or задайте свой вопрос.
Источник
Русские Блоги
Ошибка компиляции при использовании pthread win32 под Visual Studio 2015
В динамической версии pthread для win32 предоставляется только динамическая библиотека .Скомпилируйте pthread для win32 (2.9.1) в Visual Studio 2015 сегодня. struct timespec Ошибка переопределения следующая:
Под Visual Studio 2015 просто #include
, Компилятор сообщит о той же ошибке.
Причина также очень проста: последняя версия pthread для win32 была выпущена в 2012 году. В то время не было Visual Studio 2015. В версиях до Visual Studio 2015 time.h Не в timespec Структурное определение, так pthread.h Определено в struct timespec 。
для Visual Studio 2015, в time.h Добавлено в timespec Структура определена, поэтому она идет не так.
Решение 1
модификация pthread.h Добавьте определение макроса перед строкой 320, чтобы определить, следует ли определять в соответствии с номером версии MSVC struct timespec
выглядит следующим образом:
Если вы хотите перекомпилировать pthread для win32 под VS2015, вы можете использовать только этот метод.
Решение 2
Если вы просто цитируете это в своем собственном проекте pthread.h И не нужно перекомпилировать pthread для win32,
Тогда нет необходимости изменять pthread.h , В вашем собственном проекте #include
Добавить определение макроса перед HAVE_STRUCT_TIMESPEC или _TIMESPEC_DEFINED
Преимущество этого метода в том, что нет необходимости изменять pthread для кода win32 для решения проблемы в вашем собственном коде. Управление кодом более удобно.
Интеллектуальная рекомендация
Реализация оценки приложения iOS
Есть два способа получить оценку приложения: перейти в App Store для оценки и оценка в приложении. 1. Перейдите в App Store, чтобы оценить ps: appid можно запросить в iTunes Connect 2. Встроенная оцен.
JS функциональное программирование (е)
Давайте рассмотрим простой пример, чтобы проиллюстрировать, как используется Reduce. Первый параметр Reduce — это то, что мы принимаем массив arrayOfNums, а второй параметр — функцию. Эта функция прин.
PWN_JarvisOJ_Level1
Nc первый Затем мы смотрим на декомпиляцию ida Перед «Hello, World! N» есть уязвимая_функция, проверьте эту функцию после ввода Видно, что только что появившийся странный адрес является пе.
Установка и развертывание Kubernetes
На самом деле, я опубликовал статью в этом разделе давным -давно, но она не достаточно подробно, и уровень не является ясным. Когда я развернулся сегодня, я увидел его достаточно (хотя это было успешн.
На стороне многопроцессорного сервера — (2) *
Обработка сигнала Родительский процесс часто очень занят, поэтому вы не можете просто вызвать функцию waitpid, чтобы дождаться завершения дочернего процесса. Затем обсудите решение. Обратитесь .
Источник
RAXEAX 0 / 0 / 0 Регистрация: 29.08.2015 Сообщений: 12 |
||||
1 |
||||
05.09.2015, 20:22. Показов 11365. Ответов 16 Метки нет (Все метки)
Доброго времени суток. Столкнулся с такой проблемой. Пытаюсь скомпилить пример из гайда по libcurl (http://curl.haxx.se/libcurl/c/multithread.html).
Выдает ошибку: Код переопределение типа "struct" Test d:program filesmicrosoft visual studio 14.0vcincludepthread.h 320 Как исправить данную ошибку? Заранее благодарю за любой ответ.
__________________
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
05.09.2015, 20:22 |
16 |
6044 / 2159 / 753 Регистрация: 10.12.2010 Сообщений: 6,007 Записей в блоге: 3 |
|
07.09.2015, 10:58 |
2 |
Судя по всему вы пользуете какой-то порт под винду. Выложите хэдер сюда, глянем.
0 |
0 / 0 / 0 Регистрация: 29.08.2015 Сообщений: 12 |
|
07.09.2015, 11:36 [ТС] |
3 |
Вот хэдер который подключаю:pthread.7z
0 |
6044 / 2159 / 753 Регистрация: 10.12.2010 Сообщений: 6,007 Записей в блоге: 3 |
|
07.09.2015, 12:29 |
4 |
Пропустите пожалуйста ваш исходник через препроцессор и выложите результат.
0 |
0 / 0 / 0 Регистрация: 29.08.2015 Сообщений: 12 |
|
07.09.2015, 14:40 [ТС] |
5 |
К своему стыду, я не знаю какой ключ компилятора (vs) отвечает за пропуск через препроцессор.
0 |
6044 / 2159 / 753 Регистрация: 10.12.2010 Сообщений: 6,007 Записей в блоге: 3 |
|
07.09.2015, 14:41 |
6 |
Ключ /P
0 |
0 / 0 / 0 Регистрация: 07.09.2015 Сообщений: 18 |
|
07.09.2015, 14:48 |
7 |
Недавно пытался зацепить pthread к VS, и чет непонятные проблемы были, попробуй скомпилить код под линуксом, если пройдет, значит точно ошибка в библиотеке подцепленной к VS. Если хочешь, вечером сам смогу скомпилить и отписаться. Откуда взял хедер? Линуксовый или порт под винду?
0 |
0 / 0 / 0 Регистрация: 29.08.2015 Сообщений: 12 |
|
07.09.2015, 14:55 [ТС] |
8 |
После пропускания через препроцессор: main.zip
0 |
0 / 0 / 0 Регистрация: 29.08.2015 Сообщений: 12 |
|
07.09.2015, 15:00 [ТС] |
9 |
pthread.h отсюда. гайд с ссылкой на этот pthread взял отсюда
0 |
0 / 0 / 0 Регистрация: 07.09.2015 Сообщений: 18 |
|
07.09.2015, 15:03 |
10 |
pthread.h отсюда. гайд с ссылкой на этот pthread взял отсюда закомменти 320 строку в pthread.h Это конечно в плане шарпа советуют, я шарп не учил, попробуй, может прокатит)
0 |
0 / 0 / 0 Регистрация: 29.08.2015 Сообщений: 12 |
|
07.09.2015, 15:14 [ТС] |
11 |
Закомментил в pthread.h 320 строку (точнее всю структуру timespec), выдал кучу ошибок компоновщик.
0 |
0 / 0 / 0 Регистрация: 07.09.2015 Сообщений: 18 |
|
07.09.2015, 15:17 |
12 |
Закомментил в pthread.h 320 строку (точнее всю структуру timespec), выдал кучу ошибок компоновщик. Вставь сюда содержание структуры пл3
0 |
RAXEAX 0 / 0 / 0 Регистрация: 29.08.2015 Сообщений: 12 |
||||
07.09.2015, 15:26 [ТС] |
13 |
|||
0 |
6044 / 2159 / 753 Регистрация: 10.12.2010 Сообщений: 6,007 Записей в блоге: 3 |
|
07.09.2015, 16:04 |
14 |
В общем суть проблемы у вас в том, что в мейне объявлены две структуры таймспек (одна из ptherad, вторая из time.h). Посмотрите гайды по работе с вашей либой. Там наверняка в примерах есть набор дефайнов которые надо взводить. А то руками ковырять не очень продуктивно будет. Можно попробовать взвести дефайн _UWIN перед инклудом данного исходника.
0 |
1 / 1 / 1 Регистрация: 08.09.2014 Сообщений: 90 |
|
18.08.2016, 23:39 |
15 |
Столкнулся с такой же проблемой, «Ошибка C2011 timespec: переопределение типа «struct» Hello,World_2 c:program files (x86)microsoft visual studio 14.0vcincludepthread.h 320″, в файле еще ничего нет, ошибка в самой библиотеке pthread.h, не подскажите что можно сделать, может кто нашел решение?
0 |
6044 / 2159 / 753 Регистрация: 10.12.2010 Сообщений: 6,007 Записей в блоге: 3 |
|
19.08.2016, 06:38 |
16 |
Можно попробовать взвести дефайн _UWIN перед инклудом данного исходника unlimeted, вы вот это пробовали?
0 |
1 / 1 / 1 Регистрация: 08.09.2014 Сообщений: 90 |
|
19.08.2016, 22:53 |
17 |
Да, пробовал, выдает кучу ошибок типа «переменная «pthread_attr_init» не может быть инициализировано Hello,World_2 c:Program Files (x86)Microsoft Visual Studio 14.0VCincludepthread.h 891″ и т.д. Добавлено через 1 час 16 минут Добавлено через 1 час 56 минут
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
19.08.2016, 22:53 |
17 |
У меня был файл .h с некоторым кодом класса — overlay.h
#include<iostream>
#include<boost/thread.hpp>
#include<vector>
#include<boost/asio.hpp>
#include <string>
#include <boost/serialization/vector.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <sstream>
#include <boost/tuple/tuple.hpp>
#include<member.h>
using boost::asio::ip::tcp;
class overlay_server{...};
struct member{
std::string ip_address;
short int port;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & ip_address;
ar & port;
}
};
Теперь я переместил структуру в другой новый файл с именем member.h
и включил этот файл, чтобы мой класс overlay_server мог его использовать.
Теперь, когда я собираю программу, я получаю ошибку.
Какие изменения я должен сделать, чтобы сделать эту работу?
Я читал о средствах защиты заголовков на SO, но не мог понять, как реализовать это здесь для решения проблемы.
—-редактировать—-
member.h
struct member{
std::string ip_address;
short int port;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & ip_address;
ar & port;
}
};
run.cpp
#include<overlay_server.h>
#include<overlay_client.h>
int main(){
overlay_server overlay_server_(8002);
boost::thread thread_(boost::bind(&overlay_server::member_list_server, overlay_server_));overlay_client overlay_client_("127.0.0.1",8002);
overlay_client_.member_list_client();
thread_.join();
}
У меня нет переопределения структуры где-либо.
У меня есть другой класс с именем overlay_client, он также использует struct member.
В моей основной функции я создаю объекты как overlay_server, так и overlay_client.
Теперь моя программа запускается только в том случае, если member.h включен в overlay_server.h (хотя этого требует код как в overlay_server, так и в overly_client)
если он включен в оба, то я получаю ошибку переопределения
Зачем?
—-редактировать—-
этот код в моем member.h решает проблему
Ошибка компиляции «Переопределение типа ‘struct’» хотя это первое определение для него
0
Решение
Вы также можете использовать pragma
и получить тот же эффект. На вершине все ваши заголовочные файлы, напишите:
#pragma once
rest of the header
.
.
.
И способ использования стражей включений заключается в том, чтобы окружить все содержимое файла заголовка включенной защитой, которая выглядит следующим образом:
// At the very top
#if !defined(SOME_SYMBOL)
#define SOME_SYMBOL
rest of the header
.
.
.
// At the very bottom
#endif // SOME_SYMBOL
Теперь, выбирая разумное имя вместо SOME_SYMBOL
является очень важно. Большинство программистов делают защитное имя на основе имени файла (а также пути и имени проекта и названия компании / отдельного лица.) Например, для заголовка с именем «some_header.h» (или «SomeHeader.h»), расположенного в «[root проекта ] / include / myproject «, вы бы назвали имя охранника __INCLUDE__MY_PROJECT__SOME_HEADER_H__
, Но это всего лишь предложение; подойдет любой уникальный символ.
Вы также можете объединить pragma
и включают охранников (потому что pragma
метод Можно улучшить время компиляции в очень больших проектах, но не все компиляторы его поддерживают.) Если вы хотите их обоих, напишите:
#pragma once
#if !defined(__INCLUDE__MY_PROJECT__SOME_HEADER_H__)
#define __INCLUDE__MY_PROJECT__SOME_HEADER_H__
rest of the header
.
.
.
#endif // __INCLUDE__MY_PROJECT__SOME_HEADER_H__
Это не имеет негативных последствий (насколько мне известно), только возможность предотвратить ошибки сборки и ускорить сборку (в больших проектах). Но обратите внимание, что значения включают в себя защиту и #pragma once
являются не точно так же. В очень очень редких случаях вам нужно будет использовать один или другой, или ни того, ни другого.
1
Другие решения
Это то, что происходит.
у тебя есть
member.h
включен в overlay_server.h
И в overlay_client.h
теперь, когда вы включите эти два в main.cpp
это как вы делаете это в main.cpp (на самом деле препроцессор раскрывается как показано ниже)
#include"member.h"#include"member.h"
так что обычно будет так после полного расширения
struct member{...};
struct member{...}; //redifinition!!
поэтому компилятор разбирает его как два определения struct member
(потому что он дважды посетит member.h и прочитает определение структуры члена).
что делать, чтобы этого избежать
в member.h добавить это
#ifndef MEMBER_DECL //initially not defined
#define MEMBER_DECL //include guard(now first time you enter this MEMBER_DECL will get defined. so second time compiler comes here it skips this.)
struct member
{
//rest here
};
#endif
теперь в основном у вас будет это
#include"member.h" //when this happens MEMBER_DECL is defined
так
//#include"member.h" member will not be expanded again hence resolving your redfinition
1
Если overlay.h
содержит struct member
определение и member.h
также имеет struct member
определение, вы не можете включить member.h
от overlay.h
, Вот как работают охранники:
#include<iostream>
#include<boost/thread.hpp>
#include<vector>
#include<boost/asio.hpp>
#include <string>
#include <boost/serialization/vector.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <sstream>
#include <boost/tuple/tuple.hpp>
#include<member.h>
#ifndef _H__MEMBER_
#define _H__MEMBER_
using boost::asio::ip::tcp;
class overlay_server{...};
struct member{
std::string ip_address;
short int port;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & ip_address;
ar & port;
}
};
#endif
Обратите внимание на #ifndef _H__MEMBER_
а также #define _H__MEMBER_
а также #endif
, С включенной защитой, он гарантирует, что ваш заголовок включен только один раз, потому что после первого включения ЧАС_MEMBER_ будет уже определен, поэтому он пропустит определение. Ваше соглашение об именах может быть другим, но обычно я делаю что-то вроде _H__<HEADER NAME>_
как мой определяет.
0
While executing a Pthread program in C using Visual Studio 2015, I got the following error:
Error C2011 ‘timespec’: ‘struct’ type redefinition
The following is my 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);
}
Rachid K.
4,1323 gold badges10 silver badges29 bronze badges
asked Oct 14, 2015 at 0:00
1
Add this compiler flag:
-DHAVE_STRUCT_TIMESPEC
answered Nov 16, 2015 at 10:56
user_0user_0
3,07620 silver badges32 bronze badges
1
Despite this question is already answered correctly, there is also another way to solve this problem.
First, problem occurs because pthreads-win32
internally includes time.h
which already declares timespec struct
.
To avoid this error the only thing we should do is this:
#define HAVE_STRUCT_TIMESPEC
#include <pthread.h>
answered Apr 7, 2018 at 8:15
NutCrackerNutCracker
11k2 gold badges41 silver badges68 bronze badges
The same problem happens when compiling programs in Visual Studio 2015 that include MariaDB 10 header files (saw it with 10.1.14).
The solution there is to define the following:
STRUCT_TIMESPEC_HAS_TV_SEC
STRUCT_TIMESPEC_HAS_TV_NSEC
answered Jun 3, 2016 at 8:36
Joao CostaJoao Costa
2,4831 gold badge21 silver badges14 bronze badges
On Visual Studio 2015.
I solve the problem adding:
#define _TIMESPEC_DEFINED
answered Nov 8, 2019 at 4:01
Delete all instances of ‘TIMESPEC’ in pthread.h (Make a backup first.)
If I understand it correctly, you probably downloaded pthreads and tried installing it into your VS.
But the pthreads.h file doesn’t play nicely with the TIMESPEC defintions already defined in some other header file.
So, delete the portions of the pthreads.h file where TIMESPEC is defined.
answered Nov 7, 2015 at 21:40
2
While executing a Pthread program in C using Visual Studio 2015, I got the following error:
Error C2011 'timespec': 'struct' type redefinition
The following is my 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);
}
The pthread.h
header file contains the following code related to 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 */
No other header file which I use uses the timespec
struct, so there is no chance of redefining. There is no chance of a corrupted header file because it has been downloaded from pthread opensource website.
RAXEAX 0 / 0 / 0 Регистрация: 29.08.2015 Сообщений: 12 |
||||
1 |
||||
05.09.2015, 20:22. Показов 11247. Ответов 16 Метки нет (Все метки)
Доброго времени суток. Столкнулся с такой проблемой. Пытаюсь скомпилить пример из гайда по libcurl (http://curl.haxx.se/libcurl/c/multithread.html).
Выдает ошибку: Код переопределение типа "struct" Test d:program filesmicrosoft visual studio 14.0vcincludepthread.h 320 Как исправить данную ошибку? Заранее благодарю за любой ответ.
__________________ 0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
05.09.2015, 20:22 |
16 |
6044 / 2159 / 753 Регистрация: 10.12.2010 Сообщений: 6,007 Записей в блоге: 3 |
|
07.09.2015, 10:58 |
2 |
Судя по всему вы пользуете какой-то порт под винду. Выложите хэдер сюда, глянем. 0 |
0 / 0 / 0 Регистрация: 29.08.2015 Сообщений: 12 |
|
07.09.2015, 11:36 [ТС] |
3 |
Вот хэдер который подключаю:pthread.7z 0 |
6044 / 2159 / 753 Регистрация: 10.12.2010 Сообщений: 6,007 Записей в блоге: 3 |
|
07.09.2015, 12:29 |
4 |
Пропустите пожалуйста ваш исходник через препроцессор и выложите результат. 0 |
0 / 0 / 0 Регистрация: 29.08.2015 Сообщений: 12 |
|
07.09.2015, 14:40 [ТС] |
5 |
К своему стыду, я не знаю какой ключ компилятора (vs) отвечает за пропуск через препроцессор. 0 |
6044 / 2159 / 753 Регистрация: 10.12.2010 Сообщений: 6,007 Записей в блоге: 3 |
|
07.09.2015, 14:41 |
6 |
Ключ /P 0 |
0 / 0 / 0 Регистрация: 07.09.2015 Сообщений: 18 |
|
07.09.2015, 14:48 |
7 |
Недавно пытался зацепить pthread к VS, и чет непонятные проблемы были, попробуй скомпилить код под линуксом, если пройдет, значит точно ошибка в библиотеке подцепленной к VS. Если хочешь, вечером сам смогу скомпилить и отписаться. Откуда взял хедер? Линуксовый или порт под винду? 0 |
0 / 0 / 0 Регистрация: 29.08.2015 Сообщений: 12 |
|
07.09.2015, 14:55 [ТС] |
8 |
После пропускания через препроцессор: main.zip 0 |
0 / 0 / 0 Регистрация: 29.08.2015 Сообщений: 12 |
|
07.09.2015, 15:00 [ТС] |
9 |
pthread.h отсюда. гайд с ссылкой на этот pthread взял отсюда 0 |
0 / 0 / 0 Регистрация: 07.09.2015 Сообщений: 18 |
|
07.09.2015, 15:03 |
10 |
pthread.h отсюда. гайд с ссылкой на этот pthread взял отсюда закомменти 320 строку в pthread.h Это конечно в плане шарпа советуют, я шарп не учил, попробуй, может прокатит) 0 |
0 / 0 / 0 Регистрация: 29.08.2015 Сообщений: 12 |
|
07.09.2015, 15:14 [ТС] |
11 |
Закомментил в pthread.h 320 строку (точнее всю структуру timespec), выдал кучу ошибок компоновщик. 0 |
0 / 0 / 0 Регистрация: 07.09.2015 Сообщений: 18 |
|
07.09.2015, 15:17 |
12 |
Закомментил в pthread.h 320 строку (точнее всю структуру timespec), выдал кучу ошибок компоновщик. Вставь сюда содержание структуры пл3 0 |
RAXEAX 0 / 0 / 0 Регистрация: 29.08.2015 Сообщений: 12 |
||||
07.09.2015, 15:26 [ТС] |
13 |
|||
0 |
6044 / 2159 / 753 Регистрация: 10.12.2010 Сообщений: 6,007 Записей в блоге: 3 |
|
07.09.2015, 16:04 |
14 |
В общем суть проблемы у вас в том, что в мейне объявлены две структуры таймспек (одна из ptherad, вторая из time.h). Посмотрите гайды по работе с вашей либой. Там наверняка в примерах есть набор дефайнов которые надо взводить. А то руками ковырять не очень продуктивно будет. Можно попробовать взвести дефайн _UWIN перед инклудом данного исходника. 0 |
1 / 1 / 1 Регистрация: 08.09.2014 Сообщений: 90 |
|
18.08.2016, 23:39 |
15 |
Столкнулся с такой же проблемой, «Ошибка C2011 timespec: переопределение типа «struct» Hello,World_2 c:program files (x86)microsoft visual studio 14.0vcincludepthread.h 320″, в файле еще ничего нет, ошибка в самой библиотеке pthread.h, не подскажите что можно сделать, может кто нашел решение? 0 |
6044 / 2159 / 753 Регистрация: 10.12.2010 Сообщений: 6,007 Записей в блоге: 3 |
|
19.08.2016, 06:38 |
16 |
Можно попробовать взвести дефайн _UWIN перед инклудом данного исходника unlimeted, вы вот это пробовали? 0 |
1 / 1 / 1 Регистрация: 08.09.2014 Сообщений: 90 |
|
19.08.2016, 22:53 |
17 |
Да, пробовал, выдает кучу ошибок типа «переменная «pthread_attr_init» не может быть инициализировано Hello,World_2 c:Program Files (x86)Microsoft Visual Studio 14.0VCincludepthread.h 891″ и т.д. Добавлено через 1 час 16 минут Добавлено через 1 час 56 минут 0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
19.08.2016, 22:53 |
17 |
Everything was working well untill I moved some code from the main file to a new class, then I had the following error:
error C2011: ‘color1’ : ‘struct’ type redefinition
struct color1
{
color1()
{
red = green = blue = 0;
}
color1(float _red, float _green, float _blue)
{
red = _red;
green = _green;
blue = _blue;
}
float red, green, blue;
};
Any idea ?
asked Apr 28, 2011 at 21:12
HomamHomam
23k32 gold badges108 silver badges187 bronze badges
4
If the compiler says it’s redefined, then it probably is.
My psychic debugging skills tell me that you moved the struct from a source file to a header file, and forget the include guards in that header, which is then included multiple times in a source file.
EDIT: As a general rule I generally suggest avoiding leading underscores. In some cases (for example followed by a capital letter) they’re reserved for the implementation and it’s simplest to just never use leading _
instead of hoping you remember all the rules.
answered Apr 28, 2011 at 21:14
Mark BMark B
94.2k10 gold badges107 silver badges185 bronze badges
2
From snippet above I can’t deduce something is wrong.
But typically this error means that you are including same header files multiple times. Don’t you forget to add standard guards for include files?
#ifndef MY_HEADER_FILE_
#define MY_HEADER_FILE_
// here is your header file code
#endif
answered Apr 28, 2011 at 21:16
beduinbeduin
7,7533 gold badges26 silver badges24 bronze badges
1
You can have the definition of the structure on a header file.
Have
#pragma once
at the beginning of the header where the struct is defined, it solves the problem.
answered Nov 2, 2016 at 18:54
Jake OPJJake OPJ
3412 silver badges8 bronze badges
I had the same problem and luckily did not take long figure out that it was just a silly mistake.
The thing was that I had a backup of my project at another drive (D:) but all the code was set on the drive C: when explicitly defined the full path. I created it on the C: path and was always using that way, but accidentally opened the project from the D and thought that it was the same thing, so at compile it was including twice because in some cases it was including the code from the C: path and at others from the D: path.
answered Oct 7, 2019 at 13:07
ChrCury78ChrCury78
4073 silver badges7 bronze badges
I had the same problem too, and it turned out that I made a mistake with my header guard. For example, instead of writing:
#ifndef COMMAND_H
#define COMMAND_H
// My code
#endif // COMMAND_H
I made a little and hard to recognize typo:
#ifndef COMNAND_H
#define COMMAND_H
// My code
#endif // COMMAND_H
That is, COMNAND_H not COMMAND_H. It should be the letter M rather than the letter N. I fixed that and everything was fine. Hope this answer help you with your case!!!
answered Jun 17, 2021 at 8:19
Everything was working well untill I moved some code from the main file to a new class, then I had the following error:
error C2011: ‘color1’ : ‘struct’ type redefinition
struct color1
{
color1()
{
red = green = blue = 0;
}
color1(float _red, float _green, float _blue)
{
red = _red;
green = _green;
blue = _blue;
}
float red, green, blue;
};
Any idea ?
asked Apr 28, 2011 at 21:12
HomamHomam
23k32 gold badges108 silver badges187 bronze badges
4
If the compiler says it’s redefined, then it probably is.
My psychic debugging skills tell me that you moved the struct from a source file to a header file, and forget the include guards in that header, which is then included multiple times in a source file.
EDIT: As a general rule I generally suggest avoiding leading underscores. In some cases (for example followed by a capital letter) they’re reserved for the implementation and it’s simplest to just never use leading _
instead of hoping you remember all the rules.
answered Apr 28, 2011 at 21:14
Mark BMark B
94.2k10 gold badges107 silver badges185 bronze badges
2
From snippet above I can’t deduce something is wrong.
But typically this error means that you are including same header files multiple times. Don’t you forget to add standard guards for include files?
#ifndef MY_HEADER_FILE_
#define MY_HEADER_FILE_
// here is your header file code
#endif
answered Apr 28, 2011 at 21:16
beduinbeduin
7,7533 gold badges26 silver badges24 bronze badges
1
You can have the definition of the structure on a header file.
Have
#pragma once
at the beginning of the header where the struct is defined, it solves the problem.
answered Nov 2, 2016 at 18:54
Jake OPJJake OPJ
3412 silver badges8 bronze badges
I had the same problem and luckily did not take long figure out that it was just a silly mistake.
The thing was that I had a backup of my project at another drive (D:) but all the code was set on the drive C: when explicitly defined the full path. I created it on the C: path and was always using that way, but accidentally opened the project from the D and thought that it was the same thing, so at compile it was including twice because in some cases it was including the code from the C: path and at others from the D: path.
answered Oct 7, 2019 at 13:07
ChrCury78ChrCury78
4073 silver badges7 bronze badges
I had the same problem too, and it turned out that I made a mistake with my header guard. For example, instead of writing:
#ifndef COMMAND_H
#define COMMAND_H
// My code
#endif // COMMAND_H
I made a little and hard to recognize typo:
#ifndef COMNAND_H
#define COMMAND_H
// My code
#endif // COMMAND_H
That is, COMNAND_H not COMMAND_H. It should be the letter M rather than the letter N. I fixed that and everything was fine. Hope this answer help you with your case!!!
answered Jun 17, 2021 at 8:19
При выполнении программы Pthread на C с помощью Visual Studio 2015 я получил следующую ошибку
Ошибка C2011 «timespec»: переопределение типа «структура»
Вот мой код:
#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);
}
5 ответов
Лучший ответ
Добавьте этот флаг компилятора:
-DHAVE_STRUCT_TIMESPEC
7
user_0
31 Окт 2016 в 13:14
Несмотря на то, что на этот вопрос уже дан правильный ответ, есть и другой способ решить эту проблему.
Во-первых, проблема возникает из-за того, что pthreads-win32
внутренне включает time.h
, который уже объявляет timespec struct
.
Чтобы избежать этой ошибки, мы должны сделать следующее:
#define HAVE_STRUCT_TIMESPEC
#include <pthread.h>
6
NutCracker
7 Апр 2018 в 08:15
Та же проблема возникает при компиляции программ в Visual Studio 2015, которые включают файлы заголовков MariaDB 10 (видел это с 10.1.14).
Решение состоит в следующем:
STRUCT_TIMESPEC_HAS_TV_SEC
STRUCT_TIMESPEC_HAS_TV_NSEC
1
Joao Costa
3 Июн 2016 в 08:36
В Visual Studio 2015.
Решаю проблему добавлением:
#define _TIMESPEC_DEFINED
0
Román Castillo
8 Ноя 2019 в 04:01
Удалите все экземпляры TIMESPEC в pthread.h (сначала сделайте резервную копию).
Если я правильно понимаю, вы, вероятно, скачали pthreads и пытались установить его в свой VS.
Но файл pthreads.h плохо сочетается с определениями TIMESPEC, уже определенными в каком-то другом заголовочном файле.
Итак, удалите части файла pthreads.h, в которых определен TIMESPEC.
-6
jinisnotmyname
31 Окт 2016 в 13:13
При выполнении программы Pthread на C с помощью Visual Studio 2015 я получил следующую ошибку
Ошибка C2011 «timespec»: переопределение типа «структура»
Вот мой код:
#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);
}
5 ответов
Лучший ответ
Добавьте этот флаг компилятора:
-DHAVE_STRUCT_TIMESPEC
7
user_0
31 Окт 2016 в 13:14
Несмотря на то, что на этот вопрос уже дан правильный ответ, есть и другой способ решить эту проблему.
Во-первых, проблема возникает из-за того, что pthreads-win32
внутренне включает time.h
, который уже объявляет timespec struct
.
Чтобы избежать этой ошибки, мы должны сделать следующее:
#define HAVE_STRUCT_TIMESPEC
#include <pthread.h>
6
NutCracker
7 Апр 2018 в 08:15
Та же проблема возникает при компиляции программ в Visual Studio 2015, которые включают файлы заголовков MariaDB 10 (видел это с 10.1.14).
Решение состоит в следующем:
STRUCT_TIMESPEC_HAS_TV_SEC
STRUCT_TIMESPEC_HAS_TV_NSEC
1
Joao Costa
3 Июн 2016 в 08:36
В Visual Studio 2015.
Решаю проблему добавлением:
#define _TIMESPEC_DEFINED
0
Román Castillo
8 Ноя 2019 в 04:01
Удалите все экземпляры TIMESPEC в pthread.h (сначала сделайте резервную копию).
Если я правильно понимаю, вы, вероятно, скачали pthreads и пытались установить его в свой VS.
Но файл pthreads.h плохо сочетается с определениями TIMESPEC, уже определенными в каком-то другом заголовочном файле.
Итак, удалите части файла pthreads.h, в которых определен TIMESPEC.
-6
jinisnotmyname
31 Окт 2016 в 13:13