gpt4 book ai didi

c++ - C++ 代码中的 volatile 相关错误

转载 作者:可可西里 更新时间:2023-11-01 13:44:23 26 4
gpt4 key购买 nike

你能帮我理解为什么编译器会给我这些错误信息吗?我相信 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 编译器。

最佳答案

pNextList,通过 volatile 访问路径,也是 volatile。但是 pNextList指针pointee 类型具有与以前相同的 cv 资格。

也就是说,对于

struct A
{
lThreadInfo* p;
};

someStruct volatile* volatile* p;
  • *psomeStruct volatile* volatile
  • 类型的左值
  • (*p)->dlThreadInfo* volatile 类型的左值。

因此在 (*p)->d 类型中,您缺少 lThreadInfo* 之间的 volatile 。 [expr.ref]/4:

If E2 is a non-static data member and the type of E1 is “cq1 vq1 X”, and the type of E2 is “cq2 vq2 T”, the expression designates the named member of the object designated by the first expression. If E1 is an lvalue, then E1.E2 is an lvalue; if E1 is an xvalue, then E1.E2 is an xvalue; otherwise, it is a prvalue. Let the notation vq12 stand for the “union” of vq1 and vq2; that is, if vq1 or vq2 is volatile, then vq12 is volatile. Similarly, let the notation cq12 stand for the “union” of cq1 and cq2 ; that is, if cq1 or cq2 is const, then cq12 is const. If E2 is declared to be a mutable member, then the type of E1.E2 is “vq12 T”. If E2 is not declared to be a mutable member, then the type of E1.E2 is “cq12 vq12 T.

vq1volatilevq2 是空的。因此 vq12易变的。因此表达式的类型是volatile T,即lThreadInfo* volatile

关于c++ - C++ 代码中的 volatile 相关错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26950959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com