小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

淺談extern "C++"/extern "C "

 WUCANADA 2012-04-24
淺談extern "C"/extern "C++ " (2011-05-27 15:47)
分類: C/C++筆記


 以前基本沒接觸過extern "C"或者extern "C++  "這樣的用法??赡芷髽I(yè)中會(huì)用到,就來小記下,以后不會(huì)了在回頭來看下。實(shí)在不行就百度啦! 

 從 字面意思來看,extern就是申明她修飾的函數(shù)或者全局變量(記住是全局變量哦)可以被本模塊或者其它模塊所調(diào)用。"C"/"C "就是連接規(guī)范的規(guī)定,表明采用的是C還是C 連接規(guī)范。比如模塊B想調(diào)用模塊A的全局變量,只需要在A中申明全局變量為extern 就可以了,那么雖然在編譯時(shí)找不到,但是B在連接時(shí)就可以找從A編譯好的模塊中找到了。但是從來沒用過。唉!
 與此對(duì)應(yīng)的是static,被她申明的只能在本模塊中使用。
 
 remember: extern int a;這樣申明的話表明了其實(shí)并沒有為a分配內(nèi)存空間,而且在所有的模塊中只能被定義為一次。還是沒用過。唉!
 先說下加了extern "C"和不加在C 中的連接方式的不同吧:
 //模塊A moduleA.h
 #ifndef MODULE_A_H
 #define MODULE_A_H
 void Print(ElemType e);
 #endif
 //模塊A的實(shí)現(xiàn) moduleB.cpp
 #include "moduleA.h"
 Print(ElemType e);
 當(dāng)模塊B調(diào)用模塊A的函數(shù)時(shí),她會(huì)從A模塊生成的moduleA.obj中去尋找_moduleA_ElemType_或者類似這種類型的符號(hào)。
 再說加了extern "C":
 #ifndef MODULE_A_H
 #define MODULE_A_H
 extern "C" void Print(ElemType e);
 #endif
 那么當(dāng)B在同樣的調(diào)用時(shí):
 1.A模塊生成的編譯目標(biāo)并沒有生成類似_moduleA_ElemType_這種符號(hào);
 2.B尋找的是未經(jīng)過處理的_Print.
總體來說,當(dāng)面試官問你extern "C"的作用時(shí),你就說她就是實(shí)現(xiàn)了C和C++的混合編成。我曾看過百度的幾道面試題,其中就有一個(gè)這個(gè),還有一些設(shè)計(jì)模式的題目。沒事多看看啊。

具體舉例來講:
 C++中調(diào)用C函數(shù)----->>>
 /***C頭文件test.h****/
 #ifndef TEST_H
 #define TEST_H
 extern "C" int QQ(int e);
 #endif
 /***C 實(shí)現(xiàn)文件 test.c**/
 #include "test.h"
 int QQ(int e)
 {
    return e*e;
 }
 //C++文件實(shí)現(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++實(shí)現(xiàn)**** cppSquare.cpp/
 #include "cppSquare.h"
 int QQ(int e)
 {
    return e*e;
 }
 //C文件調(diào)用實(shí)現(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)致連接方式不同。所以才會(huì)導(dǎo)致調(diào)用方式不同呢?

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多