static和extern理解


C語言static修飾函數詳細解析(http://www.jb51.net/article/40520.htm)

在C語言中,static的字面意思很容易把我們導入歧途,其實它的作用有三條。
介紹它的第一條也是最重要的一條:隱藏。
當我們同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個源文件,一個是a.c,另一個是main.c。

下面是a.c的內容

char a = 'A'; // global variable
void msg()
{
    printf("Hello\n");
}

下面是main.c的內容

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

程序的運行結果是:
A Hello

你可能會問:為 什么在a.c中定義的全局變量a和函數msg能在main.c中使用?前面說過,所有未加static前綴的全局變量和函數都具有全局可見性,其它的源文 件也能訪問。此例中,a是全局變量,msg是函數,並且都沒有加static前綴,因此對於另外的源文件main.c是可見的。

如果加了static,就會對其它源文件隱藏。例如在a和msg的定義前加上static,main.c就看不到它們了。利用這一特性可以在不同的 文件中定義同名函數和同名變量,而不必擔心命名沖突。Static可以用作函數和變量的前綴,對於函數來講,static的作用僅限於隱藏。

c語言中static和extern的用法詳細解析(http://www.jb51.net/article/41686.htm)

一,static和extern:
大工程下我們會碰到很多源文檔。

文檔a.c

static int i; //只在a文檔中用
int j;    //在工程里用
static void init()         //只在a文檔中用
{
}
void callme()          //在工程中用
{
   static int sum;
}

上面的全局i變量和init()函數只能用在a.c文檔中,全局變量sum的作用域只在callme里。變量j和函數callme()的全局限擴充到整個 工程文檔。所以能夠在下面的b.c中用extern關鍵字調用。extern告訴編譯器這個變量或函數在其他文檔里已被定義了。

文檔b.c

extern int j;     //調用a文檔里的
extern void callme();  //調用a文檔里的
int main()
{
  ...
}

extern的另外用法是當C和C++混合編程時假如c++調用的是c源文檔定義的函數或變量,那么要加extern來告訴編譯器用c方式命名函數:
文檔A.cpp調用a.c里面的變量i和函數callme()

extern "C"  //在c++文檔里調用c文檔中的變量
{
   int j;
   void callme();
}
int main()
{
   callme();
}

二,static法則:
A、若全局變量僅在單個C文檔中訪問,則能夠將這個變量修改為靜態全局變量,以降低模塊間的耦合度; 

B、若全局變量僅由單個函數訪問,則能夠將這個變量改為該函數的靜態局部變量,以降低模塊間的耦合度;

C、設計和使用訪問動態全局變量、靜態全局變量、靜態局部變量的函數時,需要考慮重入問題;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM