2010-03-19 64 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

相關問題