Можете ли вы помочь мне понять, почему компилятор дает мне эти сообщения об ошибках? Я считаю, что члены изменчивых объектов тоже нестабильны. Я имею в виду от here. Но он показывает, что если мы имеем структуру:Неустойчивая связанная ошибка в коде C++
struct someStruct
{
int d;
};
А «р» определенный как:
volatile someStruct* volatile* p;
&(*p)->d
имеют следующий вид «Int * летучий *» вместо «летучего междунар * volatile * '. Ниже приведен фактический код, над которым я работаю.
Линия (отмечена ошибками 1 & 2), где компилятор выдает сообщение об ошибке:
#include <vector>
#include <windows.h>
using namespace std;
struct ThreadInfo
{
bool bWaiting = false;
bool bWorking = false;
};
struct lThreadInfo
{
ThreadInfo d;
lThreadInfo *pNextList = nullptr;
} volatile *volatile lThreads(nullptr);
thread_local ThreadInfo* currentThr(nullptr);
void CreateThread_(void (*pFunc)(ThreadInfo*))
{
volatile lThreadInfo* volatile* p = &lThreads;
for(; *p; p = &(*p)->pNextList); //**//error 1!**
*p = new lThreadInfo;
CreateThread(
nullptr, // default security attributes
0, // use default stack size
(long unsigned int (*)(void*))pFunc, // thread function name
&(*p)->d, // argument to thread function **//error 2!**
0, // use default creation flags
nullptr);
}
Ошибки сообщениях являются следующим:
error 1: invalid conversion from 'lThreadInfo* volatile*' to 'volatile lThreadInfo* volatile*' [-fpermissive]
error 2: invalid conversion from 'volatile void*' to 'LPVOID {aka void*}' [-fpermissive]
Примечания: Я знаю, что летучие не имеют ничего общего с потокобезопасностью, так что не надо мне так говорить. Note1: Я использую компилятор mingw64 на окнах.
Для второй ошибки вам понадобится 'const_cast', чтобы отключить' volatile' для вызова функции Windows API. Для первой ошибки член 'pNextList' также должен быть' volatile' (или удалить 'volatile' из' p'). – Niall
Но не следует ли создавать объект с изменчивым спецификатором, автоматически также делает все его подвыходы? – AnArrayOfFunctions
'lThreadInfo :: pNextList' имеет тип' lThreadInfo * '. Если у вас есть объект 'lThreadInfo', который является' volatile', например. 'lThreadInfo volatile o;', тогда 'o.pNextList' является' lThreadInfo * volatile'. Cv-квалификаторы всегда применяются к типу «outmost», а не к указанному типу. – dyp