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

2022-10-28 15:40:35 字數 4394 閱讀 5900

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語言問題,C語言問題C語言問題

include include int main b k p b k 0 puts b return 0 c語言問題c語言問題 include int main int h,m scanf d d h,m printf s num h if m 0 else printf o clock print...

const 和 volatile 在c語言中有何區別 const定義的值不能被修

const定義的值不能被修改 volatile可以 volatile的意思是它定義的變數很可能被修改 程式每次讀這個變數時不是從暫存器讀而是從記憶體讀 防止該值發生了改變 首先,定義為const 的值 是可以改變的!舉例說明吧 方法如下 你可以嘗試哦 const int i 100 int p i ...

C語言問題,C語言問題C語言問題

這題考的是自動型別轉換,由編譯系統自動完成,轉換是 向上 靠的 舉個例子 include stdio.h void main 你編譯一下就會有警告 conversion from double to float possible loss of data 也就是說系統預設轉化了a,b的資料型別為do...