1. 程式人生 > >C語言中的auto、 register、extern、static用法

C語言中的auto、 register、extern、static用法

auto、register 兩個是用來修飾變數的, extern、static兩個都變數函式都可以。
一、 auto
   定義的變數預設是auto型別的

二、register變數

       關鍵字regiter請求編譯器儘可能的將變數存在CPU的暫存器中。有以下幾點注意的地方。

        1、register變數必須是能被CPU暫存器所接受的型別,這通常意味著register變數必須是一個單個的值,並且其長度應小於或等於整型的長度。

    但是,有些機器的暫存器也能存放浮點數。

       2、register變數可能不存放在記憶體中,所以不能用取址符運算子“ & ”。

       3、只有區域性變數和形參可以作為register變數,全域性變數不行。

       4、靜態變數不能定義為register。 register修飾符暗示編譯程式相應的變數將被頻繁地使用,如果可能的話,應將其儲存在CPU的暫存器中,以加快其儲存速度。例如下面的記憶體塊拷貝程式碼,

/* Procedure for the assignment of structures, */

/* if the C compiler doesn't support this feature */

  #ifdef NOSTRUCTASSIGN

  memcpy (d, s, l)

{

register char *d;

  register char *s;

  register int i;

  while (i--)

  *d++ = *s++;

  }

#endif

三、static

      1、修飾變數(區域性和全域性變數)

             ①靜態全域性變數:

               在全域性資料區分配記憶體;未經初始化的靜態全域性變數會被程式自動初始化為0(自動變數的值是隨機的,除非它被顯式初始化);

      作用域僅限於變數被定義的檔案中。

               全域性變數和全域性靜態變數的區別:  

              1)全域性變數是不顯式用static修飾的全域性變數,但全域性變數 預設是靜態的,作用域是整個工程,在一個檔案內定義的全域性變數,在另一個檔案中,

        通過extern 全域性變數名的宣告,就可以使用全域性變數。

           2)全域性靜態變數是顯式用static修飾的全域性變數,作用域是所在的檔案,其他的檔案即使用extern宣告也不能使用。

          ② 靜態區域性變數

#include<cstdio>增加這條語句 char a = ‘A‘; // global variable void msg()  {      printf("Hellon");  }

你可能會問:為什麼在a.c中定義的全域性變數a和函式msg能在main.c中使用?前面說過,所有未加static字首的全域性變數和函式都具有全域性可見性,其它的原始檔也能訪問。此例中,a是全域性變數,msg是函式,並且都沒有加static字首,因此對於另外的原始檔main.c是可見的。 如果加了static,就會對其它原始檔隱藏。例如在a和msg的定義前加上static,main.c就看不到它們了。利用這一特性可以在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。Static可以用作函式和變數的字首,對於函式來講,static的作用僅限於隱藏,而對於變數,static還有下面兩個作用。 (2)static的第二個作用是保持變數內容的持久。儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域性變數和static變數,只不過和全域性變數比起來,static可以控制變數的可見範圍,說到底static還是用來隱藏的。 (3)static的第三個作用是預設初始化為0。其實全域性變數也具備這一屬性,因為全域性變數也儲存在靜態資料區。在靜態資料區,記憶體中所有的位元組預設值都是0x00,某些時候這一特點可以減少程式設計師的工作量。 最後對static的三條作用做一句話總結。首先static的最主要功能是隱藏,其次因為static變數存放在靜態儲存區,所以它具備永續性和預設值0。 下面是main.c的內容 除了標頭檔案,需要宣告函式:void msg();

int main(void) {         extern char a;    // extern variable must be declared before use      printf("%c ", a);      (void)msg();     return 0; }

    2、靜態函式

     在函式的返回型別前加上static關鍵字,函式即被定義為靜態函式。靜態函式與普通函式不同,它只能在宣告它的檔案當中可見,

   不能被其它檔案使用。其它檔案中可以定義相同名字的函式,不會發生衝突。

static 函式…..   內部函式和外部函式   當一個源程式由多個原始檔組成時,C語言根據函式能否被其它原始檔中的函式呼叫,將函式分為內部函式和外部函式。   1 內部函式(又稱靜態函式)   如果在一個原始檔中定義的函式,只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫,這種函式稱為內部函式。   定義一個內部函式,只需在函式型別前再加一個“static”關鍵字即可,如下所示:   static 函式型別 函式名(函式引數表)   {……}   關鍵字“static”,譯成中文就是“靜態的”,所以內部函式又稱靜態函式。但此處“static”的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案。   使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名,因為同名也沒有關係。   2 外部函式   外部函式的定義:在定義函式時,如果沒有加關鍵字“static”,或冠以關鍵字“extern”,表示此函式是外部函式:   [extern] 函式型別 函式名(函式引數表)   {……}   呼叫外部函式時,需要對其進行說明:   [extern] 函式型別 函式名(引數型別表)[,函式名2(引數型別表2)……];   案例]外部函式應用。   (1)檔案mainf.c

  main()   { extern void input(…),process(…),output(…);   input(…); process(…); output(…);   }   (2)檔案subf1.c   ……   extern void input(……) /*定義外部函式*/   {……}   (3)檔案subf2.c   ……   extern void process(……) /*定義外部 函式*/   {……}   (4)檔案subf3.c   ……   extern void output(……) /*定義外部函式*/   {……} 


相關推薦

C言中的void和void*的定義及用法

void void最常見的用法,就是在函式中限定函式的引數和返回值的 void draw(void); 表明函式draw沒有引數也沒有返回值,void在別的的地方的應用我也沒見過; 實際上,如果把void 和int,char,double等型別放到一起理解的話,首先還是那

C言中auto registerexternstatic用法

auto、register 兩個是用來修飾變數的, extern、static兩個都變數函式都可以。 一、 auto 定義的變數預設是auto型別的二、register變數       關鍵字regiter請求編譯器儘可能的將變數存在CPU的暫存器中。有以下幾點注

C言中的constextern及結構體聯合體的定義

分析過程: A、 首先,看變數名"next", 並注意到它直接被括號所括住; B.1、所以先把括號裡的東西作為一個整體,得出“next 是一個指向 ...的指標"。 B、 然後考慮括號外面的東西,在星號字首和括號字尾之間做出選擇。 B.2、規則告訴我們優先順序較高的是右邊的函式括號,所以得出”next是一個函

【轉載】在C言中,doublelongunsignedintchar類型數據所占字節數

src 有關 指針變量 none nbsp ide iso isp cli 和機器字長及編譯器有關系: 所以,int,long int,short int的寬度都可能隨編譯器而異。但有幾條鐵定的原則(ANSI/ISO制訂的): 1 sizeof(short int)&

C言中的I/O函數scanfgetcharprintf和putchar說明

重要 col ace 驗證 enter inpu 個數 是否 交互 scanf()、printf()、getchar()和putchar()這四個函數能夠讓用戶和程序交流,所以被稱為輸入/輸出函數,或簡稱為I/O函數。 這裏先結合緩沖輸入來講講scanf()和getchar

C言中scanfgetsfgets的區別

1.scanf會讀取標準輸入緩衝區中的輸入行內容直到遇到回車或空白(回車、tab、空格)以換行為例,會把換行符之前的資料全部讀入到scanf指定的變數中,回車(\n)依然儲存 在緩衝區中,等待下次讀取標準輸入緩衝區 遇到上面這種情況一般需要加入一下程式碼來清空快取區的行

C言中getchar()gets()和scanf()的特點以及scanf產生的多餘回車符問題

     第一件事建議大家少用gets函式。        我遇到的這個問題實在是C語言新手比較容易遇到的一個問題。是關於get()和getchar()這兩個函式的。大家都知道,gets()函式作用

年齡與疾病成績判斷及C言中if else 的簡單應用

年齡與疾病 描述 某醫院想統計一下某項疾病的獲得與否與年齡是否有關,需要對以前的診斷記錄進行整理。 輸入 共2行,第一行為過往病人的數目n(0 < n <= 100),第二行為每個病人患病時的年齡。 輸出 每個年齡段(分四段:18以下,1

C言中fstatstat和lstat 區別

在寫應用程式的時候發現我們經常回去檢測一個檔案的大小,有了大小才能對映這個檔案到記憶體上,方便我們直接操作。 在介紹三者的區別之前,首先介紹的是一個非常重要的結構體型別,名字叫做struct stat

C言中malloccallocrealloc動態記憶體分配的理解

void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(size_t numElements, size_t sizeOfElement); 都在stdlib.h函式庫內 它們的返回值都是請求系

C言中exit(0)exit(1)exit(2)有什麼不同?

exit好象在stdio.h裡面,所以要有包含標頭檔案 return是返回函式呼叫,如果返回的是main函式,則為退出程式 exit是在呼叫處強行退出程式,執行一次程式就結束 ----------------------------------------------

C言中sizeofstrlen函數的使用

png .com ima block cto com 大小 studio pch 一、測試環境   Win10 + Visual Studio 2017 二、測試代碼 #include "pch.h" #include <iostream> #in

C言中Extern用法

規範 這一 聲明 不一定 bsp 可用 代碼 指針 一點   extern用在變量或函數的聲明前,用來說明“此變量/函數是在別處定義的,要在此處引用”。   extern修飾變量的聲明。   舉例:若a.c中需引用b.c中的變量int v,可以在a.c中聲明exte

C言中staticextern

  怕原作者刪除,所以轉載過來! 原文地址:http://blog.csdn.net/keyeagle/article/details/6708077/          C語言程式碼是以檔案為單位來

C言中extern用法

1.extern修飾變數或者函式的宣告。 舉例:若a.c中需引用b.c中的變數int v,可以在a.c中宣告extern int v,然後就可以引用變數v;需要注意的是,被引用的變數v的連結屬性必須是外連結(external)的,也就是說a.c要引用到變數v,不

C言中register型別的變數有什麼意義

一般情況下,變數的值是儲存在記憶體中的,CPU 每次使用資料都要從記憶體中讀取。如果有一些變數使用非常頻繁,從記憶體中讀取就會消耗很多時間,例如 for 迴圈中的增量控制: int i; for(i=0; i<1000; i++){ // Some Cod

c言中staticauto的區別

1、static變數存放在靜態儲存區,在程式整個執行期間都不釋放;而auto變數存放在動態儲存區,隨著生命週期的結束而立即釋放。 2、static變數只賦值一次,以後就不用賦值;而auto變數在函式每呼叫一次都要賦初值

轉載 C言中register型別的變數有什麼意義

一般情況下,變數的值是儲存在記憶體中的,CPU 每次使用資料都要從記憶體中讀取。如果有一些變數使用非常頻繁,從記憶體中讀取就會消耗很多時間,例如 for 迴圈中的增量控制: int i; for(i=0; i<1000; i++){ // Some C

C言中static靜態變數,extern外部變數的區別

1:什麼是static static,叫做靜態變數。一般用於全域性變數裡面,首先,我們來考慮一下為什麼要用到static,我們可以想一下,一個專案其實是由很多位工程師一起來完成的,他們之間是互相獨立完成自己所要完成的一個模組的,這就有可能出現定義相同的全域性變數或者全域性函

C言中staticextern用法

在C語言中,static與extern的用法 (1)修飾區域性變數 a.一般情況下,對於區域性變數是存放在棧區的,並且區域性變數的生命週期在該語句塊執行結束時便結束了。但是如果用static進行修飾的話,該變數便存放在靜態資料區,其生命週期一直持續到整個程式