91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

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

C/C++語(yǔ)言中extern的用法

單片機(jī)與嵌入式 ? 來(lái)源:?jiǎn)纹瑱C(jī)與嵌入式 ? 2023-11-29 14:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

聲明外部變量

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

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

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

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

這就是說(shuō),在編譯階段,各個(gè)文件中定義的全局變量相互是透明的,編譯A時(shí)覺(jué)察不到B中也定義了i,同樣,編譯B時(shí)覺(jué)察不到A中也定義了i。但是在鏈接階段,要將各個(gè)文件的內(nèi)容“合為一體”,因此,如果某些文件中定義的全局變量名相同的話,在鏈接階段就會(huì)報(bào)重復(fù)定義(oneormoremultiplydefinedsymbols)的錯(cuò)誤。

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

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

舉個(gè)例子

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

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

出現(xiàn)如下意料之中的編譯錯(cuò)誤,未定義int i錯(cuò)誤(undeclaredidentifierError),因?yàn)樵阪溄又癆、B文件中的變量是彼此不可見(jiàn)的。

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)

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

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

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

相對(duì)于C,C++中新增了諸如重載等新特性,它們的編譯有一些重要區(qū)別。將下面的小程序分別按C和C++方式編譯,來(lái)探討兩種編譯方式的區(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

可見(jiàn),C方式編譯下,變量名和函數(shù)名之前被統(tǒng)一加上了一個(gè)下劃線,而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)用就會(huì)有一些微妙之處。有如下CPP文件A.CPP和C文件B.C兩個(gè)文件。

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

//B.C
void func()
{
}

對(duì)A.CPP和B.C分別編譯,都沒(méi)有問(wèn)題,但是鏈接時(shí)出現(xiàn)錯(cuò)誤,原因就是C和CPP不同的編譯方式產(chǎn)生的沖突。比如在上文中提到,C方式編譯下,變量名和函數(shù)名之前被統(tǒng)一加上了一個(gè)下劃線,而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)

此時(shí),可以通過(guò)extern關(guān)鍵字,來(lái)幫助編譯器解決上面提到的問(wèn)題。對(duì)于本例,只需將A.CPP改成如下代碼即可:

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

審核編輯:湯梓紅

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

    關(guān)注

    3

    文章

    4381

    瀏覽量

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

    關(guān)注

    22

    文章

    2119

    瀏覽量

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

    關(guān)注

    1

    文章

    1662

    瀏覽量

    50249
  • extern
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    3069

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

文章出處:【微信號(hào):?jiǎn)纹瑱C(jī)與嵌入式,微信公眾號(hào):?jiǎn)纹瑱C(jī)與嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C語(yǔ)言中枚舉的基本概念和常見(jiàn)用法

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

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

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

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

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

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

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

    c語(yǔ)言中typedef的用法

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

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

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

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

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

    C語(yǔ)言中的#和##的用法

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

    C語(yǔ)言C++的特點(diǎn)與用法詳細(xì)說(shuō)明

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

    你真的知道C語(yǔ)言extern C有什么作用嗎

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

    C語(yǔ)言中extern

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

    C語(yǔ)言中的typedef的用法

    在以前的學(xué)習(xí)中對(duì)于C語(yǔ)言中typedef和define的認(rèn)識(shí)是,#define是宏,作用是簡(jiǎn)單的替換,而typedef也是替換,只不過(guò)比define高級(jí)的是在替換的時(shí)候會(huì)進(jìn)行語(yǔ)法檢查。但是后來(lái)
    發(fā)表于 01-13 13:36 ?0次下載
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中</b>的typedef的<b class='flag-5'>用法</b>

    C語(yǔ)言中extern

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

    詳解C語(yǔ)言中特殊用法

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

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

    C語(yǔ)言中重要的關(guān)鍵字有很多,static const extern我們之前都講過(guò),還有一個(gè)在面試中出現(xiàn)的頻率也比較高:register。
    的頭像 發(fā)表于 08-25 17:10 ?1460次閱讀
    淺析<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中</b>的regiseter關(guān)鍵字
    主站蜘蛛池模板: 污污视频在线免费看 | 国产叼嘿视频网站在线观看 | 色综合天天综合网国产成人 | 欧美特黄一免在线观看 | 欧美adc影院| 黄色大成网站 | 亚洲人成网站色7799在线播放 | 欧美一区二区三区成人看不卡 | 亚洲日本一区二区 | 国模一区二区三区私啪啪 | 91网站在线看 | 天天看片夜夜爽 | 欧美三级图片 | 国产亚洲欧美一区二区 | 久久青草国产手机看片福利盒子 | 免费一级特黄特色大片 | 欧美一级乱理片免费观看 | 国产精品国产主播在线观看 | 日韩毛片一级 | 在线亚洲日产一区二区 | 狠狠狠狼鲁欧美综合网免费 | 狠狠色狠狠色 | 日本不卡在线播放 | 狠狠操人人 | 最新四虎4hu影库地址在线 | 99香蕉国产| 色噜噜亚洲精品中文字幕 | 四虎国产精品高清在线观看 | 国产成人精品亚洲77美色 | 欧美日本俄罗斯一级毛片 | 亚洲欧美日韩另类精品一区二区三区 | 国产女主播在线 | 亚洲va中文va欧美va爽爽 | 日本一区二区视频 | 亚洲天堂三级 | 欧美极品另类xxx | 思思久久96热在精品不卡 | 月夜免费观看完整视频 | 丁香五婷婷 | 狠狠做久久深爱婷婷97动漫 | 色视频在线免费看 |