考慮這個(可惡)一段代碼:
volatile unsigned long a[1];
unsigned long T;
void main(void)
{
a[0] = 0x6675636b; /* first access of a */
T = *a;
*(((char *)a) + 3) = 0x64; /* second access of a */
T = *a;
}
...這樣的問題:是((char *)a)
易失性或非易失性?
這引出了一個更大的問題:應該在兩次訪問之間存在依賴關係嗎?也就是說,人類常識說有,但是C99標準說揮發性物質不會混淆非揮發性物質 - 所以如果((char *)a)
是非揮發性的,那麼這兩個訪問就不會混淆,並且不存在依賴。
更正確地,C99 6.7.3(第5段)讀:
「如果試圖指與揮發性限定類型通過使用左值的具有非易失性定義的對象限定的類型,行爲是不確定的。「
所以當我們輸入字符串a
時,volatile限定符是否適用?
我想你回答了你自己的問題,它是未定義的。實際上,我認爲volatile不會產生任何影響,它是某種在通用平臺上被忽略的編譯器提示。 –
@ AndrewTomazos-Fathomling「我認爲volatile不會產生任何影響,它是某種在常見平臺上被忽略的編譯器提示」您可能正在考慮「register」。在2012年的C代碼中,'volatile'類型限定符非常有意義,因爲當前(C語言)的時尚是積極的優化和嵌入式應用程序,兩者只能與程序員提示(如volatile)一起共存。 –
@ AndrewTomazos-Fathomling,沒有'volatile'不僅是一個提示,它是一個命令來加載內存中的值在*每個*訪問。 –