曰本美女∴一区二区特级A级黄色大片, 国产亚洲精品美女久久久久久2025, 页岩实心砖-高密市宏伟建材有限公司, 午夜小视频在线观看欧美日韩手机在线,国产人妻奶水一区二区,国产玉足,妺妺窝人体色WWW网站孕妇,色综合天天综合网中文伊,成人在线麻豆网观看

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C/C++語言中extern的用法

單片機與嵌入式 ? 來源:單片機與嵌入式 ? 2023-11-29 14:34 ? 次閱讀

聲明外部變量

現代編譯器一般采用按文件編譯的方式,因此在編譯時,各個文件中定義的全局變量是互相透明的,也就是說,在編譯時,全局變量的可見域限制在文件內部。下面舉一個簡單的例子。創(chuàng)建一個工程,里面含有A.cpp和B.cpp兩個簡單的C++源文件:

//A.cpp
inti;
voidmain()
{
}
//B.cpp
int i;

這兩個文件極為簡單,在A.cpp中定義了一個全局變量i,在B中也定義了一個全局變量i。對A和B分別編譯,都可以正常通過編譯,但是進行鏈接的時候,卻出現了錯誤,錯誤提示如下:

Linking...
B.obj:errorLNK2005:"inti"(?i@@3HA)alreadydefinedinA.obj
Debug/A.exe:fatalerrorLNK1169:oneormoremultiplydefinedsymbolsfound
Errorexecutinglink.exe.
A.exe - 2 error(s), 0 warning(s)

這就是說,在編譯階段,各個文件中定義的全局變量相互是透明的,編譯A時覺察不到B中也定義了i,同樣,編譯B時覺察不到A中也定義了i。但是在鏈接階段,要將各個文件的內容“合為一體”,因此,如果某些文件中定義的全局變量名相同的話,在鏈接階段就會報重復定義(oneormoremultiplydefinedsymbols)的錯誤。

因此,各個文件中定義的全局變量名不可相同。

在鏈接階段,編譯產生的obj文件合并了A、B兩文件的內容,這也是出現int i重復定義錯誤的原因。

舉個例子

一個文件中定義的全局變量,可以在整個程序的任何地方被使用,舉例說,如果A文件中定義了某全局變量,那么B文件中也可以使用該變量。修改我們的程序,加以驗證:

//A.cpp
voidmain()
{
i=100; //試圖使用B中定義的全局變量
}
//B.cpp
int i;

出現如下意料之中的編譯錯誤,未定義int i錯誤(undeclaredidentifierError),因為在鏈接之前A、B文件中的變量是彼此不可見的。

Compiling...
A.cpp 
C:/Documents and Settings/wangjian/桌面/try extern/A.cpp(5) : error C2065: 'i' : undeclared identifier
Errorexecutingcl.exe.
A.obj-1error(s),0warning(s)

編譯器沒有能夠意識到,某個變量符號雖然不是本文件定義的,但是它可能是在其它的文件中定義的,為了避免錯誤的發(fā)生extern派上用場了。為上面的錯誤程序加上extern關鍵字后,順利通過編譯,鏈接,代碼如下:

//A.cpp
externinti;
voidmain()
{
i=100;//試圖使用B中定義的全局變量
}
//B.cpp
int i;

在C++文件中調用C方式編譯的函數

相對于C,C++中新增了諸如重載等新特性,它們的編譯有一些重要區(qū)別。將下面的小程序分別按C和C++方式編譯,來探討兩種編譯方式的區(qū)別。

inti;
intfunc(intt)
{
  return0;
}
voidmain()
{
}

以C方式編譯的結果如下:

COMM_i:DWORD
PUBLIC_func
PUBLIC    _main

以C++方式編譯的結果如下:

PUBLIC?i@@3HA;i
PUBLIC?func@@YAHH@Z;func
PUBLIC    _main

可見,C方式編譯下,變量名和函數名之前被統一加上了一個下劃線,而C++編譯后的結果卻復雜的多,i變成了?i@@ 3HA ,func變成了?func@@YAHH@Z。C++中的這種看似復雜的命名規(guī)則是為C++中的函數重載,參數檢查等特性服務的。

不同編譯方式下的函數調用

如果在工程中,不僅有CPP文件,還有以C方式編譯的C文件,函數調用就會有一些微妙之處。有如下CPP文件A.CPP和C文件B.C兩個文件。

//A.CPP
voidfunc();
voidmain()
{
  func();
}

//B.C
void func()
{
}

對A.CPP和B.C分別編譯,都沒有問題,但是鏈接時出現錯誤,原因就是C和CPP不同的編譯方式產生的沖突。比如在上文中提到,C方式編譯下,變量名和函數名之前被統一加上了一個下劃線,而C++編譯后的結果卻復雜的多,i變成了?i@@ 3HA。

Linking...
A.obj:errorLNK2001:unresolvedexternalsymbol"void__cdeclfunc(void)"(?func@@YAXXZ)
Debug/A.exe:fatalerrorLNK1120:1unresolvedexternals
Errorexecutinglink.exe.
A.exe - 2 error(s), 0 warning(s)

此時,可以通過extern關鍵字,來幫助編譯器解決上面提到的問題。對于本例,只需將A.CPP改成如下代碼即可:

//A.CPP
extern "C"
{
  void func(); //引入C語言方式編譯的函數或變量
}
void main()
{
  func();
}

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4365

    瀏覽量

    63940
  • C++
    C++
    +關注

    關注

    22

    文章

    2116

    瀏覽量

    74639
  • 編譯器
    +關注

    關注

    1

    文章

    1653

    瀏覽量

    49770
  • extern
    +關注

    關注

    0

    文章

    7

    瀏覽量

    3023

原文標題:C/C++語言中extern的用法

文章出處:【微信號:單片機與嵌入式,微信公眾號:單片機與嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    C語言中枚舉的基本概念和常見用法

    C語言中,枚舉是一種方便組織和表示一組相關常量的工具。枚舉類型有助于提高代碼的可讀性和可維護性。本文將介紹C語言枚舉的基本概念、語法和用法
    發(fā)表于 08-17 15:32 ?1907次閱讀

    單片機的C語言中位操作用法

    單片機的C語言中位操作用法
    發(fā)表于 08-17 15:04

    C語言中atoi()函數的用法 相關資料分享

    C語言中atoi()函數的用法
    發(fā)表于 07-01 08:12

    C語言中的數據類型有哪幾種?const有哪些用法?

    C語言中的數據類型有哪幾種?const有哪些用法?作用域與static用法是什么?extern是如何去使用的?
    發(fā)表于 07-22 06:51

    c語言中typedef的用法

    C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環(huán)
    發(fā)表于 11-09 15:23 ?9431次閱讀

    解析C語言與ARM匯編與的相互調用以及與 C++ 相互調用

    全局變量只能通過地址間接調用,為了訪問C++語言中全局變量,首先要通過extern偽指令引入全局變量,然后將其地址裝入寄存器中。
    的頭像 發(fā)表于 01-23 10:29 ?6129次閱讀

    C++語言的基本構成詳細資料說明

    C++語言中的數據類型、運算、語句結構、數組、指針、函數是C++程序設計的基礎。掌握這些基本內容,對利用C++語言解決一般應用問題是非常必要
    發(fā)表于 02-19 14:49 ?0次下載
    <b class='flag-5'>C++</b><b class='flag-5'>語言</b>的基本構成詳細資料說明

    C語言中的#和##的用法

    和conStr的參數,并且宏conStr和toString中均含有#或者##符號,所以A不能被解引用。導致不符合預期的情況出現。 3.2 解決方案 結果: 責任編輯:xj 原文標題:C語言中#和##的用法 文章出處:【微信公眾號
    的頭像 發(fā)表于 12-06 09:34 ?7.7w次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>的#和##的<b class='flag-5'>用法</b>

    C語言C++的特點與用法詳細說明

    本文檔的主要內容詳細介紹的是C語言C++的特點與用法詳細說明。
    的頭像 發(fā)表于 12-26 10:58 ?4663次閱讀

    你真的知道C語言extern C有什么作用嗎

    externC”又有什么關系呢? 先看下面這個表格,如下所示; 語言 描述 C 函數名可以作為唯一ID和代碼段的程序建立聯系 C++
    的頭像 發(fā)表于 08-17 09:35 ?2672次閱讀
    你真的知道<b class='flag-5'>C</b><b class='flag-5'>語言</b>里<b class='flag-5'>extern</b> <b class='flag-5'>C</b>有什么作用嗎

    C語言中extern

    在你的C語言代碼中,不知能否看到類似下面的代碼: 這好像沒有什么問題,你應該還會想:“嗯?是啊,我們的代碼都是這樣寫的,從來沒有因此碰到過什么麻煩啊~”。 ????你說的沒錯,如果你的頭文件從來沒有
    的頭像 發(fā)表于 11-02 14:35 ?2594次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>的<b class='flag-5'>extern</b>

    C語言中的typedef的用法

    在以前的學習中對于C語言中typedef和define的認識是,#define是宏,作用是簡單的替換,而typedef也是替換,只不過比define高級的是在替換的時候會進行語法檢查。但是后來
    發(fā)表于 01-13 13:36 ?0次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>的typedef的<b class='flag-5'>用法</b>

    C語言中extern

    這與C++有什么關系呢? 看看__cplusplus(注意前面是兩個下劃線) 的名字你就應該知道它與C++有很大關系。__cplusplus是一個C++規(guī)范規(guī)定的預定義宏。你可以信任的是:所有的現代
    的頭像 發(fā)表于 04-02 16:03 ?1755次閱讀

    詳解C語言中特殊用法

    C語言有很多特殊的用法,如果這些特殊用法使用得當,會是你的代碼變得更加有健壯,更加容易維護。
    的頭像 發(fā)表于 07-15 08:57 ?1698次閱讀

    淺析C語言中的regiseter關鍵字

    C語言中重要的關鍵字有很多,static const extern我們之前都講過,還有一個在面試中出現的頻率也比較高:register。
    的頭像 發(fā)表于 08-25 17:10 ?1324次閱讀
    淺析<b class='flag-5'>C</b><b class='flag-5'>語言中</b>的regiseter關鍵字