c語言volatile的問題,C語言中的volatile是什麼意思?怎麼用?謝了

2022-05-22 14:10:03 字數 4394 閱讀 5080

1樓:二樓灣

不需要的。其實volatile是告訴編譯器,如果要讀取這個暫存器的值得話,就還去這個位址讀資料。舉個例子,在做嵌入式開發的時候,你可能需要去讀取某個i/o口的暫存器的值,這個值是經常變化的,如果在之前你有過把這個暫存器的值賦給k了,你再想讀取暫存器的值得時候,編譯器會優化**,它發現上次讀取暫存器值之後沒有對暫存器操作,所以直接就用了k的值,其實這個時候暫存器裡面的值早就變了。

所以volatile 告訴編譯器,暫存器裡面的值是隨時可能發生變化的,每次使用它的時候必須從它的位址中直接讀取,不要想省事。全手打,忘採納!!!!

2樓:

volatile修飾,意思是每次獲取該變數的值時,都強制從記憶體獲取,而不是從快取cache獲取。

巨集rurxh0的意思就是強制從記憶體裡獲取0x50000024這個位址儲存的值,而不是從cache獲取。用變數來儲存這個值,如果該變數沒有強制直接訪問記憶體的要求,就不需要volatile修飾。

3樓:匿名使用者

不需要。只是告訴編譯器不要優化rurxh0,rurxh0裡面的值是隨時都可能有變化的,不受編譯器控制,賦值的時候去取rurxh0真正的值。

4樓:匿名使用者

不用再用volatile了,但是你要是需要實時獲取rurxh0這個暫存器裡的值就要從rruxh0,而不能從變數a中獲取。

c語言中的volatile是什麼意思?怎麼用?謝了

5樓:悶聲發大才

乙個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份

6樓:匿名使用者

volatile的本意是「易變的」,volatile定義的變數它的值在編譯時是會改變的,跟const相反,而const定義的變數一直不會變的,如果變數加上volatile修飾,則編譯器保證對此變數的讀寫操作都不會被優化(肯定執行)。

7樓:輕舞飛揚張哈

c語言關鍵字volatile,表示不經過賦值,其值也可能被改變

8樓:

簡單的理解就是這個變數可能會被外部函式改變,為了讓這個改變能有效執行,不被編譯器優化掉。

舉個例子吧,乙個函式用了乙個外部的變數,但這個變數在此函式中沒有改變,只是引用,這時候編譯器會去做優化,把它的值暫放在內部暫存器中,用的時候讀取的是暫存器的值,而不是去訪問它的位址取值,這樣的話,當這個變數在外部發生了變化的時候,比如中斷,或者另外的程序等等。但在這個函式裡面就不能起作用,因為被優化後使用的是暫存器的值,還是原來的值,導致錯誤發生。這種情況下,就要加上這個定義,就不會被優化了。

c語言程式設計問題 *volatile....

9樓:匿名使用者

volatile就是不要讓編譯器優化這個變數。讀寫變數的時候直接對記憶體操作。如果優化了,會先讀取暫存器的值,(這樣就有可能和記憶體中的值不一樣了)。常用於多執行緒變數,中斷變數等

10樓:匿名使用者

volatile的作用: 作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值.簡單地說就是防止編譯器對**進行優化.

比如如下程式:xbyte[2]=0x55;xbyte[2]=0x56;xbyte[2]=0x57;xbyte[2]=0x58;對外部硬體而言,上述四條語句分別表示不同的操作,會產生四種不同的動作,但是編譯器就不能像對待純粹的程式那樣對上述四條語句進行優化,只認為xbyte[2]=0x58(即忽略前三條語句,只產生一條機器**)。如果鍵入volatile,則編譯器會逐一的進行編譯並產生相應的機器**(四條)volatile 修飾它右邊的關鍵字,*是指標。

指標與voltile組合在一起意思不變。

c語言中volatile在什麼情況下使用

11樓:

簡單的說,你所定義的這個變數,在你程式執行過程中一直會變,你希望這個值被正確的處理,你就得每次從記憶體中去讀這個值,這樣就不會有錯誤了,這個volatile就是這個作用了。

12樓:

簡單的理解就是這個變數可能會被外部函式改變,為了讓這個改變能有效執行,不被編譯器優化掉。

舉個例子吧,乙個函式用了乙個外部的變數,但這個變數在此函式中沒有改變,只是引用,這時候編譯器會去做優化,把它的值暫放在內部暫存器中,用的時候讀取的是暫存器的值,而不是去訪問它的位址取值,這樣的話,當這個變數在外部發生了變化的時候,比如中斷,或者另外的程序等等。但在這個函式裡面就不能起作用,因為被優化後使用的是暫存器的值,還是原來的值,導致錯誤發生。這種情況下,就要加上這個定義,就不會被優化了。

13樓:匿名使用者

volatile是易變的,不穩定的意思,volatile是關鍵字,是一種型別修飾符,用它修飾的變數表示可以被某些編譯器未知的因素更改,比如作業系統、硬體或者其他執行緒等,遇到這個關鍵字宣告的變數,編譯器對訪問該變數的**不在進行優化,從而可以提供對特殊位址的穩定訪問。

volatile 關鍵字告訴編譯器該變數是隨時可能發生變化的,每次使用它的時候必須從記憶體中取出他的值,因而編譯器生成的彙編**會從原記憶體位址中讀取資料使用。

如果乙個暫存器或者變數表示乙個埠或者多個執行緒的共享資料,就容易出錯,所以volatile可以保證對特殊位址的穩定訪問。

c語言中,關於volatile變數的陣列的乙個問題……

14樓:匿名使用者

10個變數都是

不太一樣,前者申請了10個變數,後面申請的是乙個指標型變數,只有它具體指向乙個單元時才將這個單元當成volatile int來操作,一般可以用a[0]或*a來進行賦值和取值

c語言中關鍵字volatile是什麼意思

15樓:小魚君吐槽

volatile的本意是一般有兩種說法。1.「暫態的 2.

「易變的。這兩種說法都有可行。乙個定義為volatile的變數是說這變數可能會被意想不到的改變,這樣,編譯器就不會去假設這個變數的值了。

優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。 www.okeycar.com

16樓:

簡單的理解就是這個變數可能會被外部函式改變,為了讓這個改變能有效執行,不被編譯器優化掉。

舉個例子吧,乙個函式用了乙個外部的變數,但這個變數在此函式中沒有改變,只是引用,這時候編譯器會去做優化,把它的值暫放在內部暫存器中,用的時候讀取的是暫存器的值,而不是去訪問它的位址取值,這樣的話,當這個變數在外部發生了變化的時候,比如中斷,或者另外的程序等等。但在這個函式裡面就不能起作用,因為被優化後使用的是暫存器的值,還是原來的值,導致錯誤發生。這種情況下,就要加上這個定義,就不會被優化了。

c語言什麼時候用volatile

17樓:辣媽寶貝

當乙個物件的值可能會在編譯器的控制或檢測之外被改變時,例如乙個被系統時鐘更新的變數,那麼物件應該宣告成volatile。編譯器執行的某些例行優化行為不能應用在已指定為volatile的物件上。volatile限定符的用法同const非常相似,都是作為型別的附加修飾符。

volatile修飾符的主要目的是提示編譯器,該物件的值可能在編譯器未監測到的情況下被改變。因此編譯器不能武斷的對引用這些物件的**作優化處理。

volatile變數的值不能修改嗎?c語言

18樓:匿名使用者

這是警告,提示兩個型別的引數不相容。

解決辦法是:

volatile u8 tx_buffer[1024]=;

u8 *p=0;

p=(u8 *) tx_buffer;   //使用 (u8 *) 強制轉換

19樓:匿名使用者

警告的意思是 你把volatile u8*型的指標賦給了u8 *型的,不是說變數不能修改。

u8 * p;改成volatile u8 * p;就不會有警告了。

20樓:

你試試p=&tx_buffer[0]

c語言問題:在乙個.c原檔案中用volatile 修飾乙個unsigned char 型變數a 10

21樓:匿名使用者

你為什麼認為 extern可以省略型別呢? 你對型別是怎麼理解的 這裡說的extern可以省略型別是說可以省略變數的儲存型別 也就是說char int long 這種的型別,前面的unsigned

和volatile都是修飾符 和extern為同級的 自然不能省略了

C語言問題,C語言問題

符合,相當於一個字元,ascii字元可以直接轉成short整型數字。101 不符合,這是一個字串,不能作為常數。不符合,因為 會對雙引號轉義,找不到另一個雙引號。會出錯。而且就算是 也不符合,因為編譯器會把它理解成一個字串,而非單個字元。e3不符合。019不符合,0開頭代表8進位制數,不能出現9。0...

C語言問題,c語言問題

這是值傳遞,值傳遞的過程的是,系統會給你的實參的值進行乙個拷貝,把這個拷貝傳遞給形式引數。因為是拷貝,所以實參裡頭的值是不會改變的。如果是位址傳遞就不一樣了。補充 你可以定義乙個指標,這個指標指向主函式的結構體。然後子函式的形參也定義乙個指向結構提的指標。這樣就是位址傳遞了。樓主還是好好花點時間看看...

C語言問題謝謝,C語言報錯的問題?

先寫個函式,原型類似 char convert char from 然後for迴圈遍歷每個字元,呼叫convert函式賦值 c語言問題,謝謝!這樣簡單的 復問題,按照制書上的舉例。套出一bai個來就行了,就是du乙個迴圈語句,內 zhi加乙個判斷奇偶語句dao就行了吧!源程式如下 include i...