哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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í),全局變量的可見域限制在文件內(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文件中的變量是彼此不可見的。

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

可見,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

    文章

    4421

    瀏覽量

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

    關(guān)注

    22

    文章

    2124

    瀏覽量

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

    關(guān)注

    1

    文章

    1672

    瀏覽量

    51883
  • extern
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    3199

原文標(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ǔ)言中枚舉的基本概念和常見用法

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

    單片機(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 ?1.1w次閱讀

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

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

    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.9w次閱讀
    <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 ?5606次閱讀

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

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

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

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

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

    C語(yǔ)言中重要的關(guān)鍵字有很多,static const extern我們之前都講過(guò),還有一個(gè)在面試中出現(xiàn)的頻率也比較高:register。
    的頭像 發(fā)表于 08-25 17:10 ?2115次閱讀
    淺析<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中</b>的regiseter關(guān)鍵字
    博罗县| 基隆市| 铁岭县| 兴国县| 虞城县| 济阳县| 常山县| 喀喇沁旗| 鞍山市| 河东区| 沙湾县| 潞西市| 会东县| 宁远县| 芦溪县| 晋中市| 伊宁市| 龙州县| 建瓯市| 阿克| 龙门县| 鲁山县| 前郭尔| 自治县| 德安县| 丰宁| 潢川县| 宝坻区| 渝北区| 大同市| 连州市| 澳门| 额尔古纳市| 象山县| 石阡县| 呼和浩特市| 蒙自县| 康保县| 利津县| 中山市| 阜康市|