C語言extern的使用以及頭文件*.h的內容格式注意


用VS2013 分開寫多文件的程序,出現了許多重定義的問題,總結解決方法如下:

在*.h文件中使用以下的格式:

#ifndef <標識> 
#define <標識> 

...... 
...... 

#endif 

<標識>在理論上來說可以是自由命名的,但每個頭文件的這個“標識”都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前后加下划線,並把文件名中的“.”也變成下划線,如:stdio.h 
#ifndef _STDIO_H_ 
#define _STDIO_H_ 
...... 
#endif 

 

放在.h文件中的主要內容有:函數聲明(主要功能),宏定義(只應用與當前cpp文件的一些變量定義),以及函數原型

注意:1.不要在.h文件中放置 具體函數(放在具體實現功能的.cpp文件中)

   2.涉及到具體的全局變量時,“extern用在變量聲明中常常有這樣一個作用,你在*.c文件中聲明了一個全局的變量,這個全局的變量如果要被引用,就放在*.h中並用extern來聲明。”  ------(在*.c中定義全局,在.h中利用 extern 來引用)

 

 

extern的用法:

 基本解釋:extern可以置於變量或者函數前,以標示變量或者函數的定義在別的文件中,提示編譯器遇到此變量和函數時在其他模塊中尋找其定義。此外extern也可用來進行鏈接指定。(extern是C/C++語言中表明函數全局變量作用范圍(可見性)的關鍵字,該關鍵字告訴編譯器,其聲明的函數和變量可以在本模塊或其它模塊中使用。)

      也就是說extern有兩個作用:

    第一個,當它與"C"一起連用時,如: extern "C" void fun(int a, int b);則告訴編譯器在編譯fun這個函數名時按着C的規則去翻譯相應的函數名而不是C++的,C++的規則在翻譯這個函數名時會把fun這個名字變得面目全非,可能是fun@aBc_int_int#%$也可能是別的,這要看編譯器的"脾氣"了(不同的編譯器采用的方法不一樣),為什么這么做呢,因為C++支持函數的重載啊,在這里不去過多的論述這個問題,如果你有興趣可以去網上搜索,相信你可以得到滿意的解釋!
    第二,當extern不與"C"在一起修飾變量或函數時,如在頭文件中: extern int g_Int; 它的作用就是聲明函數或全局變量的作用范圍的關鍵字,其聲明的函數和變量可以在本模塊活其他模塊中使用,記住它是一個聲明不是定義!也就是說B模塊(編譯單元)要是引用模塊(編譯單元)A中定義的全局變量或函數時,它只要包含A模塊的頭文件即可,在編譯階段,模塊B雖然找不到該函數或變量,但它不會報錯,它會在連接時從模塊A生成的目標代碼中找到此函數。

 

與extern對應的static關鍵字:

在變量和函數前加static,表明被它修飾的全局變量和函數只能在本模塊中使用。因此,一個函數或變量只可能被本模塊使用時,其不可能被extern “C”修飾。 

單個文件中的全局變量可以在變量前面添加 static 來隱藏只在這個文件中使用的變量 

 

引用博客--http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html


免責聲明!

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



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