C++代码中与易失性相关的错误
Volatile related error in C++ code
你能帮我理解为什么编译器给我这些错误消息吗?我相信挥发性物体的成员也是易变的。我指的是从这里开始的。但它表明,如果我们有一个结构:
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]
注意:我知道易失性与线程安全无关,所以不要费心告诉我。注意1:我在Windows上使用mingw64编译器。
pNextList
通过volatile
访问路径也是volatile
。但pNextList
是指针。尖头类型具有与以前相同的CV资格。
也就是说,对于
struct A
{
lThreadInfo* p;
};
someStruct volatile* volatile* p;
-
*p
是类型someStruct volatile* volatile
的左值 -
(*p)->d
是lThreadInfo* volatile
类型的左值。
因此,在(*p)->d
类型中,您错过了lThreadInfo
和*
之间的波动性。[expr.ref]/4:
如果
E2
是非静态数据成员,并且E1
的类型为"cq1 vq1X
",E2
的类型为"cq2 vq2T
",表达式 指定由第一个指定的对象的命名成员 表达。如果E1
是左值,则E1.E2
是左值;如果E1
是一个 x值,那么E1.E2
是一个 x值;否则,它是一个 prvalue。 让符号 vq12 代表 vq1 和 vq2 的"联合";也就是说,如果 vq1 或vq2volatile
,则VQ12 是volatile
.同样,让符号 cq12 代表 cq1 和 cq2 的"联合";也就是说,如果 CQ1 或 CQ2 是const
,则 cq12const
。如果E2
被声明为可变 成员,则E1.E2
的类型为"VQ12T
"。如果E2
不是 声明为可变成员,则E1.E2
类型为"CQ12VQ12T
"。
vq1 volatile
,vq2 为空。因此 vq12 是volatile
。因此表达式的类型是 volatile T
,即 lThreadInfo* volatile
。
- 易失性sig_atomic_t的内存安全性
- C++易失性:保证 32 位访问?
- 避免易失性和非易失性成员函数的代码重复
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 如何访问常量易失性 std::array?
- 为什么在 C++20 中弃用易失性?
- 根据 MSVC,具有易失性成员的结构不再是 POD
- 是否允许编译器优化掉局部易失性变量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 如何避免对无锁程序使用易失性?
- C++:易失性实例中的易失性成员函数 - 将数组分配给指针是无效的转换?
- g++ 6.3,avx 内联函数上的 Kahan 求和用易失性关键字进行序列化
- 是什么让这种易失性打破了结构的指针算法?
- 如果不需要易失性,为什么 std::atomic 方法会提供易失性重载
- *(易失性无符号整数 *) 的含义 0x00 = 0x00;
- 使用易失性 c 字符串和 std::cout
- 易失性结构 = 结构不可能,为什么?
- C++代码中与易失性相关的错误
- 易失性指针指向函数,在没有 typedef 的情况下使用时显示编译错误;需要帮助"void (* volatile userFunc)(void)"
- 为什么易失性静态成员初始化会生成重新定义编译错误