以前基本沒接觸過extern "C"或者extern "C++ "這樣的用法??赡芷髽I(yè)中會用到,就來小記下,以后不會了在回頭來看下。實在不行就百度啦!
淺談extern "C"/extern "C++ "
(2011-05-27 15:47)
分類: C/C++筆記
以前基本沒接觸過extern "C"或者extern "C++ "這樣的用法??赡芷髽I(yè)中會用到,就來小記下,以后不會了在回頭來看下。實在不行就百度啦! 從
字面意思來看,extern就是申明她修飾的函數(shù)或者全局變量(記住是全局變量哦)可以被本模塊或者其它模塊所調(diào)用。"C"/"C
"就是連接規(guī)范的規(guī)定,表明采用的是C還是C 連接規(guī)范。比如模塊B想調(diào)用模塊A的全局變量,只需要在A中申明全局變量為extern
就可以了,那么雖然在編譯時找不到,但是B在連接時就可以找從A編譯好的模塊中找到了。但是從來沒用過。唉! 與此對應(yīng)的是static,被她申明的只能在本模塊中使用。 remember: extern int a;這樣申明的話表明了其實并沒有為a分配內(nèi)存空間,而且在所有的模塊中只能被定義為一次。還是沒用過。唉! 先說下加了extern "C"和不加在C 中的連接方式的不同吧: //模塊A moduleA.h #ifndef MODULE_A_H #define MODULE_A_H void Print(ElemType e); #endif //模塊A的實現(xiàn) moduleB.cpp #include "moduleA.h" Print(ElemType e); 當(dāng)模塊B調(diào)用模塊A的函數(shù)時,她會從A模塊生成的moduleA.obj中去尋找_moduleA_ElemType_或者類似這種類型的符號。 再說加了extern "C": #ifndef MODULE_A_H #define MODULE_A_H extern "C" void Print(ElemType e); #endif 那么當(dāng)B在同樣的調(diào)用時: 1.A模塊生成的編譯目標(biāo)并沒有生成類似_moduleA_ElemType_這種符號; 2.B尋找的是未經(jīng)過處理的_Print. 總體來說,當(dāng)面試官問你extern "C"的作用時,你就說她就是實現(xiàn)了C和C++的混合編成。我曾看過百度的幾道面試題,其中就有一個這個,還有一些設(shè)計模式的題目。沒事多看看啊。 具體舉例來講: C++中調(diào)用C函數(shù)----->>> /***C頭文件test.h****/ #ifndef TEST_H #define TEST_H extern "C" int QQ(int e); #endif /***C 實現(xiàn)文件 test.c**/ #include "test.h" int QQ(int e) { return e*e; } //C++文件實現(xiàn) cppTest.cpp #include<iostream.h> extern "C" { #include "test.h" } int main(int argc, char **argv) { int square = QQ(5); cout<<square<<endl; return 0; } C中調(diào)用C++函數(shù)----->>> /***C++頭文件 cppSquare.h***/ #ifndef CPP_SQUARE_H #define CPP_SQUARE_H extern "C" int QQ(int e); #endif /***C++實現(xiàn)**** cppSquare.cpp/ #include "cppSquare.h" int QQ(int e) { return e*e; } //C文件調(diào)用實現(xiàn) cTest.cpp extern "C" int QQ(int e);//這里就不是調(diào)用頭文件了 int main(int argc, char **argv) { int square = QQ(5); cout<<square<<endl; return 0; } 基本上就是這樣的了。以后希望再多多學(xué)習(xí)。即使不知道具體在工作后能用到不。但是我還在想為什么調(diào)用方式是這樣的區(qū)別了??是不是跟編譯方式不同,導(dǎo)致連接方式不同。所以才會導(dǎo)致調(diào)用方式不同呢? |
|