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