extern 在c/c++ 中的作用
本文轉載自
http://blog.csdn.net/big_bit/article/details/51595714? ? ? ? ?感謝博主分享的相關的語法知識解析一.extern修飾變量和函數
在C語言中,修飾符extern用在變量或者函數的聲明前,用來說明“此變量/函數是在別處定義的,要在此處引用”。extern聲明不是定義,即不分配存儲空間。
先來看一段代碼
[cpp]?view plain?copy也就是說,在一個文件中定義了變量和函數, 在其他文件中要使用它們, 可以有兩種方式:
1.使用頭文件,然后聲明它們,然后其他文件去包含頭文件
2.在其他文件中直接extern
二.extern"C"作用
比如說你用C?開發了一個DLL?庫,為了能夠讓C?++語言也能夠調用你的DLL?輸出(Export)?的函數,你需要用extern "C"?來強制編譯器不要修改你的函數名。
通常,在C?語言的頭文件中經常可以看到類似下面這種形式的代碼:
[cpp]?view plain?copy1. 現在要寫一個c語言的模塊,供以后使用(以后的項目可能是c的也可能是c++的),源文件事先編譯好,編譯成.so或.o都無所謂。頭文件中聲明函數時要用條件編譯包含起來,如下:
?
[cpp]?view plain?copy也就是把所有函數聲明放在some code的位置。
2. 如果這個模塊已經存在了,可能是公司里的前輩寫的,反正就是已經存在了,模塊的.h文件中沒有extern "C"關鍵字,這個模塊又不希望被改動的情況下,可以這樣,在你的c++文件中,包含該模塊的頭文件時加上extern "C", 如下:
[cpp]?view plain?copy
3.上面例子中,如果僅僅使用模塊中的1個函數,而不需要include整個模塊時,可以不include頭文件,而單獨聲明該函數,像這樣:
?
[cpp]?view plain?copy?第三點要注意:當單獨聲明函數時候, 就不能要頭文件,或者在頭文件中不能寫extern intThisIsTest(int a, int b);否則會有error C2732: 鏈接規范與“ThisIsTest”的早期規范沖突,這個錯誤,
然后就可一使用模塊中的這個ThisIsTest函數了。
還有就是要注意在*.c文件中不能寫成extern"C"intThisIsTest(int x,int y);在C語言的頭文件中,對其外部函數只能指定為extern類型,C語言中不支持extern "C"聲明,在.c文件中包含了extern "C"時會出現編譯語法錯誤。
extern"C"的使用要點
1.?可以是單一語句
[cpp]?view plain?copy
2.?可以是復合語句,相當于復合語句中的聲明都加了extern"C"
[cpp]?view plain?copy
3.可以包含頭文件,相當于頭文件中的聲明都加了extern"C"
[cpp]?view plain?copy
4.?不可以將extern"C"添加在函數內部
5.?如果函數有多個聲明,可以都加extern"C",也可以只出現在第一次聲明中,后面的聲明會接受第一個鏈接指示符的規則。
6.?除extern"C",還有extern"FORTRAN"等。
三.聲明和定義知識點
1.定義也是聲明,extern聲明不是定義,即不分配存儲空間。extern告訴編譯器變量在其他地方定義了。
eg:extern inti; //聲明,不是定義
???????inti; //聲明,也是定義
2.如果聲明有初始化式,就被當作定義,即使前面加了extern。只有當extern聲明位于函數外部時,才可以被初始化。
eg:externdouble pi=3.1416; //定義
3.函數的聲明和定義區別比較簡單,帶有{}的就是定義,否則就是聲明。
eg:externdouble max(double d1,double d2); //聲明
???????doublemax(double d1,double d2){}//定義
4.除非有extern關鍵字,否則都是變量的定義。
eg:extern inti; //聲明
???????inti; //定義
注: basic_stdy.h中有char glob_str[];而basic_stdy.cpp有char glob_str[]("123456");此時頭文件中就不是定義,默認為extern
程序設計風格:
1.?不要把變量定義放入.h文件,這樣容易導致重復定義錯誤。
2.?盡量使用static關鍵字把變量定義限制于該源文件作用域,除非變量被設計成全局的。
也就是說
3.?可以在頭文件中聲明一個變量,在用的時候包含這個頭文件就聲明了這個變量。
總結
以上是生活随笔為你收集整理的extern 在c/c++ 中的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL server常用查询
- 下一篇: C++学习笔记系列之继承多态