<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > C語言中auto register static const volatile 區(qū)別

          C語言中auto register static const volatile 區(qū)別

          作者: 時間:2013-05-13 來源:網(wǎng)絡(luò) 收藏

          3>const成員函數(shù)的聲明中,const只能放在函數(shù)聲明的尾部,表示該類成員不修改對象.

          說明:

          const type m; //修飾m為不可改變

          示例:

          typedef char * pStr; //新的類型pStr;

          char string[4] = "abc";

          const char *p1 = string;

          p1++; //正確,上邊修飾的是*p1,p1可變

          const pStr p2 = string;

          p2++; //錯誤,上邊修飾的是p2,p2不可變,*p2可變

          同理,const修飾指針時用此原則判斷就不會混淆了。

          const int *value; //*value不可變,value可變

          int* const value; //value不可變,*value可變

          const (int *) value; //(int *)是一種type,value不可變,*value可變

          //邏輯上這樣理解,編譯不能通過,需要tydef int* NewType;

          const int* const value;//*value,value都不可變

          (5)volatile

          表明某個變量的值可能在外部被改變,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。它可以適用于基礎(chǔ)類型如:int,char,long......也適用于C的結(jié)構(gòu)和C++的類。當(dāng)對結(jié)構(gòu)或者類對象使用volatile修飾的時候,結(jié)構(gòu)或者類的所有成員都會被視為volatile.

          在多線程環(huán)境下經(jīng)常使用,因為在編寫多線程的程序時,同一個變量可能被多個線程修改,而程序通過該變量同步各個線程。

          簡單示例:

          DWORD __stdcall threadFunc(LPVOID signal)

          {

          int* intSignal=reinterpret_cast(signal);

          *intSignal=2;

          while(*intSignal!=1)

          sleep(1000);

          return 0;

          }

          該線程啟動時將intSignal 置為2,然后循環(huán)等待直到intSignal 為1 時退出。顯然intSignal的值必須在外部被改變,否則該線程不會退出。但是實際運(yùn)行的時候該線程卻不會退出,即使在外部將它的值改為1,看一下對應(yīng)的偽匯編代碼就明白了:

          mov ax,signal

          label:

          if(ax!=1)

          goto label

          對于C來說,它并不知道這個值會被其他線程修改。自然就把它cache在寄存器里面。C 是沒有線程概念的,這時候就需要用到volatile。volatile 的本意是指:這個值可能會在當(dāng)前線程外部被改變。也就是說,我們要在threadFunc中的intSignal前面加上volatile,這時候,知道該變量的值會在外部改變,因此每次訪問該變量時會重新讀取,所作的循環(huán)變?yōu)槿缦旅鎮(zhèn)未a所示:

          label:

          mov ax,signal

          if(ax!=1)

          goto label

          注意:一個參數(shù)既可以是const同時是volatile,是volatile因為它可能被意想不到地改變。它是const因為程序不應(yīng)該試圖去修改它。

          (6)extern

          extern 意為“外來的”···它的作用在于告訴編譯器:有這個變量,它可能不存在當(dāng)前的文件中,但它肯定要存在于工程中的某一個源文件中或者一個Dll的輸出中。

          c語言相關(guān)文章:c語言教程



          上一頁 1 2 下一頁

          關(guān)鍵詞: C語言 關(guān)鍵字 編譯器

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();