如何通过指向非易失性的指针接收volatile?

时间:2018-05-26 23:50:33

标签: c++ type-conversion volatile

我正在使用一个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));

1 个答案:

答案 0 :(得分:0)

从C ++语言的角度来看,这可能会导致库中出现未定义的行为,但使用const_cast会导致代码中出现未定义的行为。

但是,根据您的描述,库可能不使用C或C ++写入此内存空间(您提到它使用内存映射I / O)。因此,如果库取消引用没有volatile的指针,那么可能存在的未定义行为是不相关的,因为硬件正在这样做,而不是软件。

在任何情况下,无论您使用const_cast还是&#34;额外指针,然后分配&#34;解决方案似乎并不重要。如果内存是由硬件设备写入的,它们应该都是正常的,但如果没有volatile由库写入则不行。