日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

extern 在c/c++ 中的作用

發布時間:2025/3/15 c/c++ 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 extern 在c/c++ 中的作用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文轉載自
http://blog.csdn.net/big_bit/article/details/51595714? ? ? ? ?感謝博主分享的相關的語法知識解析

一.extern修飾變量和函數

C語言中,修飾符extern用在變量或者函數的聲明前,用來說明此變量/函數是在別處定義的,要在此處引用extern聲明不是定義,即不分配存儲空間。

先來看一段代碼

[cpp]?view plain?copy
  • /*??basic_stdy.h?*/??
  • ???
  • #ifndef_BASIC_STDY_H_??
  • #define_BASIC_STDY_H_??
  • ???
  • //extern?int?a;??????????????????????????????????//在頭文件中聲明,必須加上extern,否則就是重定義??
  • //void?fun();????????????????????????????????????//不用加extern也可以??
  • ???
  • #endif??
  • ???
  • ???
  • /*??basic_stdy.cpp?*/??
  • #include"basic_stdy.h"??
  • #include<iostream>??
  • using?namespace?std;??
  • ???
  • int?a(2);??
  • ???
  • void?fun(){??
  • ????????????cout?<<?a?<<endl;??
  • }??
  • ???
  • /*main.cpp*/??
  • #include<iostream>??
  • #include?"basic_stdy.h"??
  • using?namespace?std;??
  • ???
  • extern?int?a;????????????????????????????????????????????????????????????????????????//ok不用包含頭文件,?變量只要聲明即可??
  • extern?void?fun();???????????????????????????????????????????????????????//ok不用包含頭文件,?函數只要聲明即可??
  • ???
  • int?main(int?argc,char?**argv){??
  • ???
  • ????????????cout?<<?a?<<?endl;??
  • ????????????fun();??
  • ???
  • ????????????system("pause");??
  • ????????????return?0;??
  • }??


  • 也就是說,在一個文件中定義了變量和函數, 在其他文件中要使用它們, 可以有兩種方式:

    1.使用頭文件,然后聲明它們,然后其他文件去包含頭文件

    2.在其他文件中直接extern

    二.extern"C"作用

    比如說你用C?開發了一個DLL?庫,為了能夠讓C?++語言也能夠調用你的DLL?輸出(Export)?的函數,你需要用extern "C"?來強制編譯器不要修改你的函數名。

    通常,在C?語言的頭文件中經常可以看到類似下面這種形式的代碼:

    [cpp]?view plain?copy
  • #ifdef?__cplusplus????
  • extern?"C"?{????
  • #endif????
  • ????
  • /****?some?declaration?or?so?*****/????
  • ????
  • #ifdef?__cplusplus????
  • }????
  • #endif??
  • 1. 現在要寫一個c語言的模塊,供以后使用(以后的項目可能是c的也可能是c++的),源文件事先編譯好,編譯成.so或.o都無所謂。頭文件中聲明函數時要用條件編譯包含起來,如下:

    ?

    [cpp]?view plain?copy
  • #ifdef?__cpluscplus????
  • extern?"C"?{????
  • #endif????
  • ????
  • //some?code????
  • ????
  • #ifdef?__cplusplus????
  • }????
  • #endif????

  • 也就是把所有函數聲明放在some code的位置。

    2. 如果這個模塊已經存在了,可能是公司里的前輩寫的,反正就是已經存在了,模塊的.h文件中沒有extern "C"關鍵字,這個模塊又不希望被改動的情況下,可以這樣,在你的c++文件中,包含該模塊的頭文件時加上extern "C", 如下:

    [cpp]?view plain?copy
  • extern?"C"?{????
  • #include?"test_extern_c.h"????
  • }???

  • 3.上面例子中,如果僅僅使用模塊中的1個函數,而不需要include整個模塊時,可以不include頭文件,而單獨聲明該函數,像這樣:

    ?

    [cpp]?view plain?copy
  • extern?"C"?{????
  • int?ThisIsTest(int,?int);??????????????
  • }???

  • ?第三點要注意:當單獨聲明函數時候, 就不能要頭文件,或者在頭文件中不能寫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
  • extern?"C"?double?sqrt(double);??


  • 2.?可以是復合語句,相當于復合語句中的聲明都加了extern"C"

    [cpp]?view plain?copy
  • ?extern?"C"??
  • ?{??
  • ???double?sqrt(double);??
  • ???int?min(int,?int);??
  • }??


  • 3.可以包含頭文件,相當于頭文件中的聲明都加了extern"C"

    [cpp]?view plain?copy
  • extern"C"??
  • ??
  • ?#i?nclude?<cmath>??


  • 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.cppchar glob_str[]("123456");此時頭文件中就不是定義,默認為extern


    程序設計風格:

    1.?不要把變量定義放入.h文件,這樣容易導致重復定義錯誤。

    2.?盡量使用static關鍵字把變量定義限制于該源文件作用域,除非變量被設計成全局的。

    也就是說

    3.?可以在頭文件中聲明一個變量,在用的時候包含這個頭文件就聲明了這個變量。

    總結

    以上是生活随笔為你收集整理的extern 在c/c++ 中的作用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。