我正在使用一个API,它为我提供了内存映射I / O的指针。它通过填充指向指针的参数来实现:
int map(void** p);
因为这是内存映射的I / O,所以我很确定我应该在这里使用volatile
。 (我不知道为什么他们没有将参数设为volatile void**
。)
但是,我的volatile void**
不能隐式转换为函数的void**
,所以我不能直接传递它:
volatile void* p;
map(&p); // Error: no known conversion from 'volatile void **' to 'void **'.
我目前正在使用额外的变量和单独的分配步骤解决这个问题:
volatile void* p;
void* pNonVolatile;
map(&pNonVolatile);
p = pNonVolatile;
这似乎很冗长。在这种情况下,在传递指针时转换volatile
是否安全?即。
volatile void* p;
map(const_cast<void**>(&p));
答案 0 :(得分:0)
从C ++语言的角度来看,这可能会导致库中出现未定义的行为,但使用const_cast
会导致代码中出现未定义的行为。
但是,根据您的描述,库可能不使用C或C ++写入此内存空间(您提到它使用内存映射I / O)。因此,如果库取消引用没有volatile
的指针,那么可能存在的未定义行为是不相关的,因为硬件正在这样做,而不是软件。
在任何情况下,无论您使用const_cast
还是&#34;额外指针,然后分配&#34;解决方案似乎并不重要。如果内存是由硬件设备写入的,它们应该都是正常的,但如果没有volatile
由库写入则不行。