2010-03-19 62 views
22

考虑下面的代码:为什么在C++中寄生于'volatile'?

int main()                  
{                    
    int i;                  
    volatile int* p = &i;              
    int *v = p;                 
    return 0;                 
} 

这给出了一个错误g++

$ g++ -o volatile volatile.cpp 
volatile.cpp: In function ‘int main()’: 
volatile.cpp:6: error: invalid conversion from ‘volatile int*’ to ‘int*’ 

我的意图是,我想让p波动。但是,一旦我读取了p的值,我不在乎访问v是否是易失性的。为什么需要将v声明为volatile?

这是假设的代码,当然。在真实情况下,您可以想象p指向一个内存位置,但是被外部修改,并且我希望v指向pv = p时指向的位置,即使稍后被外部修改。因此p是易失性的,但v不是。

顺便说一句,我对这两种行为都感兴趣,当这被认为是C和C++,但在C这只会产生一个警告,而不是一个错误。

+2

标准不知道警告和错误之间的区别。只要它至少为程序报告一条消息,编译器就会选择如何处理违规。 – 2010-03-19 14:55:53

+2

也许你想要一个v的副本? – slf 2010-03-19 15:02:48

回答

36

如果你的意思是指针应挥发,而不是它指向的对象,然后把它声明为

int* volatile p; 
+7

这是你的答案,史蒂夫。我想补充一下这个建议:*总是在你想要的资格之后编写const/volatile限定符** *这是唯一一种编写限定符*的方法*,因为你可以同时写入'volatile int'和'int volatile'当你想要一个易变的整数,但只有'int * volatile'会给你一个易失性的*指针*。 – DevSolar 2010-03-19 15:14:33

+0

谢谢!我甚至没有想到这一点。完全合乎逻辑,谢谢。 – Steve 2010-03-19 15:17:22

+1

读取声明(对于const和volatile位置)最简单的方法是简单地向后读取它们。因此“int * volatile”是一个“指向int的volatile指针”。 – Adisak 2010-03-19 15:43:11

14

在C++中的volatile关键字应用同种限制什么,你可以因为这样做const呢。标准将此称为'cv-qualification',如'const/volatile限定条件。康斯坦斯只能被常量使用,而挥发物只能被挥发物使用。

就像旁白一样,这可以帮助您编写多线程代码。不是因为使用了一些编译器魔术,使得你的变量突然变成原子或类似的东西,而是通过强迫你只以易失的方式对易失性数据进行操作。有关更多信息,请参阅此Alexandrescu article

+0

也值得一读:http://www.mikeash.com/pyblog/friday-qa-2009-07-10-type-specifiers-in-c-part-3.html(别名。不要忘了OSMemoryBrier ) – slf 2010-03-19 14:56:36

相关问题