【发布时间】:2015-01-13 01:58:19
【问题描述】:
你能帮我理解为什么编译器会给我这些错误信息吗?我相信 volatile 对象的成员也是 volatile 。我指的是here。但它表明,如果我们有一个结构:
struct someStruct
{
int d;
};
而“p”的定义如下:
volatile someStruct* volatile* p;
&(*p)->d 具有以下类型 'int* volatile*' 而不是 'volatile 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]
注意:我知道 volatile 与线程安全无关,所以不要告诉我。注意1:我在 windows 上使用 mingw64 编译器。
【问题讨论】:
-
对于第二个错误,您将需要一个
const_cast来摆脱 Windows API 函数调用的volatile。对于第一个错误,成员pNextList也需要为volatile(或从p中删除volatile)。 -
但是创建一个带有 volatile 说明符的对象不应该自动使它的所有子对象也 volatile 吗?
-
lThreadInfo::pNextList的类型为lThreadInfo*。如果您有一个lThreadInfo对象,即volatile,例如lThreadInfo volatile o;,那么o.pNextList就是lThreadInfo* volatile。 cv 限定符总是应用于“最外层”的类型,而不是指向的类型。 -
那么我怎样才能存储一个指向这个子对象的指针,我可以用它来修改它,就像它来自 volatile 类型一样。
标签: c++ windows c++11 gcc volatile