91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

奈因PCB電路板設(shè)計(jì) ? 來(lái)源:小麥大叔 ? 作者:菜刀和小麥 ? 2021-08-17 09:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

我經(jīng)常在C語(yǔ)言的頭文件中看到下面的代碼:

#ifdef __cplusplus extern “C” { #endif // all of your legacy C code here #ifdef __cplusplus } #endif

這通常用于C++和C混合編程的時(shí)候,為了防止C++的編譯器在編譯C文件的時(shí)候出現(xiàn)錯(cuò)誤;

眾所周知,C++可以進(jìn)行函數(shù)名重載,但是C則沒(méi)有這種功能,那這和extern “C”又有什么關(guān)系呢?

先看下面這個(gè)表格,如下所示;

語(yǔ)言 描述
C 函數(shù)名可以作為唯一ID和代碼段的程序建立聯(lián)系
C++ 因?yàn)橹剌d的關(guān)系,函數(shù)名符號(hào)會(huì)被破壞,從而會(huì)根據(jù)函數(shù)的參數(shù)不同而重新生成函數(shù)符號(hào)

未添加 extern “C”

test.h

#ifndef TEST_H #define TEST_H void foo1(void); void foo2(void); void foo3(int i); #endif

test.c

void foo1(void){} void foo2(void) {} void foo3(int i){} int main(int argc,char** argv){ foo1(); foo2(); foo3(1); return 0; }

編譯這兩個(gè)文件,生成test.o文件,通過(guò)objdump查看函數(shù)符號(hào);

g++ -c test.c test.h objdump -t test.o

可以看到函數(shù)符號(hào)已經(jīng)被編譯器修改了;

添加extern “C”

test.h

#ifndef TEST_H #define TEST_H #ifdef __cplusplus extern “C” { #endif void foo1(void); void foo2(void); void foo3(int i); #ifdef __cplusplus } #endif #endif

test.c

#ifdef __cplusplus extern “C” { #endif void foo1(void){} void foo2(void) {} void foo3(int i){} #ifdef __cplusplus } #endif int main(int argc,char** argv){ foo1(); foo2(); foo3(1); return 0; }

編譯這兩個(gè)文件,生成test.o文件,通過(guò)objdump查看函數(shù)符號(hào);

g++ -c test.c test.h objdump -t test.o

這時(shí)候函數(shù)符號(hào)是正確的;

extern “C” 是告訴C++的編譯器不要打我這些C函數(shù)的主意。

好了,這次分享的比較簡(jiǎn)單,也挺實(shí)用,我們下期再見(jiàn)。

END

作者:菜刀和小麥

來(lái)源:小麥大叔

版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除。

編輯:jq

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

    關(guān)注

    22

    文章

    2123

    瀏覽量

    77110
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4967

    瀏覽量

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

    關(guān)注

    1

    文章

    1672

    瀏覽量

    51595
  • c函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    7709

原文標(biāo)題:你真的知道C語(yǔ)言里extern“C”的作用嗎?

文章出處:【微信號(hào):pcbgood,微信公眾號(hào):奈因PCB電路板設(shè)計(jì)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    C語(yǔ)言主要特點(diǎn)

    C語(yǔ)言的主要特點(diǎn): 1.語(yǔ)言簡(jiǎn)潔、緊湊,使用方便、靈活 。C語(yǔ)言一共只有32個(gè)關(guān)鍵字、9種控制
    發(fā)表于 01-05 07:41

    為什么c語(yǔ)言沒(méi)有輸出?

    我在寫(xiě)c語(yǔ)言程序的時(shí)候,經(jīng)常在程序編譯的時(shí)候沒(méi)有輸出,經(jīng)總結(jié),發(fā)現(xiàn)有以下原因: 1、scanf沒(méi)有加 。 2、邏輯問(wèn)題,可能沒(méi)有輸入,才沒(méi)有輸出。 3、輸入scanf(\"%d
    發(fā)表于 01-05 06:40

    C語(yǔ)言嵌入式系統(tǒng)編程注意事項(xiàng)-內(nèi)存操作

    C語(yǔ)言嵌入式系統(tǒng)編程注意事項(xiàng)之內(nèi)存操作 在嵌入式系統(tǒng)的編程中,常常要求在特定的內(nèi)存單元讀寫(xiě)內(nèi)容,匯編對(duì)應(yīng)的MOV指令,而除C/C++以外的
    發(fā)表于 01-04 07:31

    C語(yǔ)言C++的區(qū)別及聯(lián)系

    class等面向?qū)ο蟮奶匦院蜋C(jī)制。但是,后來(lái)經(jīng)過(guò)一步步修訂和很多次演變,最終才形成了現(xiàn)如今這個(gè)支持一系列重大特性的龐大編程語(yǔ)言。 一、C語(yǔ)言是面向過(guò)程語(yǔ)言,而
    發(fā)表于 12-24 07:23

    如何搞定嵌入式 C語(yǔ)言中的全局變量問(wèn)題?

    屬性就是這么干的。這對(duì)將來(lái)程序的調(diào)試也很有好處。C語(yǔ)言之所以有++版本,很大原因就是為了控制它的靈活性,要說(shuō)面向?qū)ο蟮乃枷耄?b class='flag-5'>C語(yǔ)言早已有之,亦可實(shí)現(xiàn)。 3、當(dāng)一個(gè)模塊里面的全局變量超過(guò)
    發(fā)表于 12-16 06:54

    C語(yǔ)言C++之間的區(qū)別是什么

    函數(shù)重載,即在同一作用域內(nèi)可以定義多個(gè)同名函數(shù),只要它們的參數(shù)列表不同即可。 C語(yǔ)言不支持函數(shù)重載,每個(gè)函數(shù)必須具有唯一的標(biāo)識(shí)符。 4、異常處理: C++內(nèi)置了異常處理機(jī)制,允許程
    發(fā)表于 12-11 06:23

    單片機(jī)C語(yǔ)言編程的心得

    寫(xiě)這個(gè)8*8按鍵程序的過(guò)程中,不管是在自己寫(xiě)還是參考別人程序的過(guò)程中,發(fā)現(xiàn)自己對(duì)C語(yǔ)言有些基本知識(shí)點(diǎn)和編程規(guī)范很多不懂的地方,有些是自己以前的編程習(xí)慣不好,有些就是基礎(chǔ)知識(shí)不扎實(shí)的表現(xiàn),所以總結(jié)
    發(fā)表于 12-08 07:44

    C語(yǔ)言和單片機(jī)C語(yǔ)言什么差異

    語(yǔ)言的功能特性外,它可以很好的操作底層的硬件接口。在C語(yǔ)言的基礎(chǔ)上,如果把一些單片機(jī)的端口或特殊功能寄存器加于定義,使用的時(shí)候會(huì)更加方便,寫(xiě)語(yǔ)句的時(shí)候,直接直觀(guān)的編寫(xiě)。這樣就差不多是
    發(fā)表于 11-14 07:55

    第4章 C語(yǔ)言基礎(chǔ)以及流水燈的實(shí)現(xiàn)(4.5 4.6)

    (表達(dá)式) ? ? ? ?{ ? ? ? ? ? ?循環(huán)體語(yǔ)句; ? ? ? ?} 在C語(yǔ)言,通?!氨磉_(dá)式”符合條件叫做真,不符合條件,叫做假。比如前邊i while(表達(dá)式)這個(gè)括號(hào)
    的頭像 發(fā)表于 11-06 11:21 ?350次閱讀

    第4章 C語(yǔ)言基礎(chǔ)以及流水燈的實(shí)現(xiàn)(4.3 4.4)

    的符號(hào)分別是:+、-、*、/、%。 C語(yǔ)言一個(gè)很重要的賦值運(yùn)算符“=”,前邊程序有使用過(guò)。在C語(yǔ)言
    的頭像 發(fā)表于 10-29 15:30 ?331次閱讀

    主流的 MCU 開(kāi)發(fā)語(yǔ)言為什么是 C 而不是 C++?

    在單片機(jī)的地界兒C語(yǔ)言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩
    的頭像 發(fā)表于 05-21 10:33 ?1037次閱讀
    主流的 MCU 開(kāi)發(fā)<b class='flag-5'>語(yǔ)言</b>為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C</b>++?

    深入理解C語(yǔ)言C語(yǔ)言循環(huán)控制

    改變程序的執(zhí)行流程,使代碼更加靈活和可控。本文將詳細(xì)介紹這些語(yǔ)句的作用及其應(yīng)用場(chǎng)景,并通過(guò)示例代碼進(jìn)行說(shuō)明。Part.1break語(yǔ)句C語(yǔ)言中break語(yǔ)句兩種
    的頭像 發(fā)表于 04-29 18:49 ?2043次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>循環(huán)控制

    C語(yǔ)言的歷史及程序介紹

    電子發(fā)燒友網(wǎng)站提供《C語(yǔ)言的歷史及程序介紹.pdf》資料免費(fèi)下載
    發(fā)表于 04-09 16:10 ?0次下載

    51單片機(jī)C語(yǔ)言學(xué)習(xí)筆記

    c51語(yǔ)言快速入門(mén)
    發(fā)表于 03-24 14:04 ?3次下載

    為什么學(xué)了C語(yǔ)言,卻寫(xiě)不出像樣的項(xiàng)目?

    在學(xué)習(xí)編程的路上,C語(yǔ)言幾乎是每個(gè)程序員的“必修課”。不管你是打算從事嵌入式開(kāi)發(fā)、系統(tǒng)編程,還是想要深入理解操作系統(tǒng)的底層原理,C語(yǔ)言都是一塊重要的基石。然而許多人在學(xué)習(xí)
    的頭像 發(fā)表于 03-14 17:37 ?917次閱讀
    為什么學(xué)了<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>,卻寫(xiě)不出像樣的項(xiàng)目?