日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

长见识:你真的知道C语言里extern quot;Cquot; 的作用吗?

發布時間:2023/12/2 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 长见识:你真的知道C语言里extern quot;Cquot; 的作用吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

經常在C語言的頭文件中看到下面的代碼:

#ifdef?__cplusplus extern?"C"?{ #endif//?all?of?your?legacy?C?code?here#ifdef?__cplusplus } #endif

這通常用于C 和C混合編程的時候,為了防止C 的編譯器在編譯C文件的時候出現錯誤;
眾所周知,C 可以進行函數名重載,但是C則沒有這種功能,那這和extern "C"又有什么關系呢?
先看下面這個表格,如下所示;

語言描述
C函數名可以作為唯一ID代碼段的程序建立聯系
C 因為重載的關系,函數名符號會被破壞,從而會根據函數的參數不同而重新生成函數符號

未添加 extern "C"

test.h

#ifndef?TEST_H #define?TEST_Hvoid?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; }

編譯這兩個文件,生成test.o文件,通過objdump查看函數符號;

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

可以看到函數符號已經被編譯器修改了;

添加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 } #endifint?main(int?argc,char**?argv){foo1();foo2();foo3(1);?return?0; }

編譯這兩個文件,生成test.o文件,通過objdump查看函數符號;

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

這時候函數符號是正確的;

extern "C"?是告訴C 的編譯器不要打我這些C函數的主意。

聲明:

本文于網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。

總結

以上是生活随笔為你收集整理的长见识:你真的知道C语言里extern quot;Cquot; 的作用吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。