在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

聲明外部變量

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

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

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

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。但是在鏈接階段,要將各個文件的內(nèi)容“合為一體”,因此,如果某些文件中定義的全局變量名相同的話,在鏈接階段就會報重復(fù)定義(oneormoremultiplydefinedsymbols)的錯誤。

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

在鏈接階段,編譯產(chǎn)生的obj文件合并了A、B兩文件的內(nèi)容,這也是出現(xiàn)int i重復(fù)定義錯誤的原因。

舉個例子

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

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

出現(xiàn)如下意料之中的編譯錯誤,未定義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關(guān)鍵字后,順利通過編譯,鏈接,代碼如下:

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

在C++文件中調(diào)用C方式編譯的函數(shù)

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

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

以C方式編譯的結(jié)果如下:

COMM_i:DWORD
PUBLIC_func
PUBLIC    _main

以C++方式編譯的結(jié)果如下:

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

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

不同編譯方式下的函數(shù)調(diào)用

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

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

//B.C
void func()
{
}

對A.CPP和B.C分別編譯,都沒有問題,但是鏈接時出現(xiàn)錯誤,原因就是C和CPP不同的編譯方式產(chǎn)生的沖突。比如在上文中提到,C方式編譯下,變量名和函數(shù)名之前被統(tǒng)一加上了一個下劃線,而C++編譯后的結(jié)果卻復(fù)雜的多,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關(guān)鍵字,來幫助編譯器解決上面提到的問題。對于本例,只需將A.CPP改成如下代碼即可:

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

審核編輯:湯梓紅

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

    關(guān)注

    3

    文章

    4331

    瀏覽量

    62618
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2108

    瀏覽量

    73651
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1634

    瀏覽量

    49132
  • extern
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    2952

原文標(biāo)題:C/C++語言中extern的用法

文章出處:【微信號:單片機(jī)與嵌入式,微信公眾號:單片機(jī)與嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    單片機(jī)的C語言中位操作用法

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

    C語言中atoi()函數(shù)的用法 相關(guān)資料分享

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

    C語言中的數(shù)據(jù)類型有哪幾種?const有哪些用法

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

    c語言中typedef的用法

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

    解析C語言與ARM匯編與的相互調(diào)用以及與 C++ 相互調(diào)用

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

    C++語言的基本構(gòu)成詳細(xì)資料說明

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

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

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

    C語言C++的特點與用法詳細(xì)說明

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

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

    externC”又有什么關(guān)系呢? 先看下面這個表格,如下所示; 語言 描述 C 函數(shù)名可以作為唯一ID和代碼段的程序建立聯(lián)系 C++
    的頭像 發(fā)表于 08-17 09:35 ?2487次閱讀
    你真的知道<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語言代碼中,不知能否看到類似下面的代碼: 這好像沒有什么問題,你應(yīng)該還會想:“嗯?是啊,我們的代碼都是這樣寫的,從來沒有因此碰到過什么麻煩啊~”。 ????你說的沒錯,如果你的頭文件從來沒有
    的頭像 發(fā)表于 11-02 14:35 ?2461次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>的<b class='flag-5'>extern</b>

    C語言中的typedef的用法

    在以前的學(xué)習(xí)中對于C語言中typedef和define的認(rèn)識是,#define是宏,作用是簡單的替換,而typedef也是替換,只不過比define高級的是在替換的時候會進(jìn)行語法檢查。但是后來
    發(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++有什么關(guān)系呢? 看看__cplusplus(注意前面是兩個下劃線) 的名字你就應(yīng)該知道它與C++有很大關(guān)系。__cplusplus是一個C++規(guī)范規(guī)定的預(yù)定義宏。你可以信任的是:所有的現(xiàn)代
    的頭像 發(fā)表于 04-02 16:03 ?1599次閱讀

    詳解C語言中特殊用法

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

    淺析C語言中的regiseter關(guān)鍵字

    C語言中重要的關(guān)鍵字有很多,static const extern我們之前都講過,還有一個在面試中出現(xiàn)的頻率也比較高:register。
    的頭像 發(fā)表于 08-25 17:10 ?1131次閱讀
    淺析<b class='flag-5'>C</b><b class='flag-5'>語言中</b>的regiseter關(guān)鍵字
    主站蜘蛛池模板: 91伊人久久大香线蕉| 天天做天天爱天天综合网 | 伊人狼人在线| 免费黄色国产视频| 午夜在线免费视频| 69xxx日本| 日韩一级影院| 午夜短视频| 日本高清不卡视频| 噜色| 美国一级大黄香蕉片| 在线观看黄色x视频| 亚洲欧美在线视频免费| 久久夜色精品国产亚洲噜噜| 男人午夜影院| 夜色资源站www国产在线观看| 五月婷婷综合激情| 国产成人mv在线观看入口视频| 天天干网站| 欧美成人性色区| 色吧久久| 大香伊在人线免费| 欧美性一区| 日本理论片www视频| 日本精品视频一视频高清| 久久久久久午夜精品| 狠狠噜天天噜日日噜| 性xxxfreexxxx性欧美| 色l情视频| 清纯唯美亚洲综合一区| 亚洲成a人片777777久久| 黄色三级在线观看| 日本伊人网| 一级毛片日韩| 一级午夜| 最新精品| 99视频精品全国免费| 美女免费视频一区二区三区| 国产小视频你懂的| 一道精品一区二区三区| 狠狠躁夜夜躁人人爽天天段|