长见识:你真的知道C语言里extern quot;Cquot; 的作用吗?
生活随笔
收集整理的這篇文章主要介紹了
长见识:你真的知道C语言里extern quot;Cquot; 的作用吗?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
經常在C語言的頭文件中看到下面的代碼:
這通常用于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);#endiftest.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#endiftest.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; 的作用吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 16.5 Beta 3续航怎么样
- 下一篇: C语言中#if,#if defined