成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你真的知道C語言里Extern "C" 的作用嗎?

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

[[410586]]

大家好,我是小麥,今天是周末,但是也不能停下學習的腳步。

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

  1. #ifdef __cplusplus 
  2. extern "C" { 
  3. #endif 
  4.  
  5. // all of your legacy C code here 
  6.  
  7. #ifdef __cplusplus 
  8. #endif 

這通常用于C++和C混合編程的時候,為了防止C++的編譯器在編譯C文件的時候出現錯誤;

眾所周知,C++可以進行函數名重載,但是C則沒有這種功能,那這和extern "C"又有什么關系呢?

先看下面這個表格,如下所示;

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

未添加 extern "C"

test.h

  1. #ifndef TEST_H 
  2. #define TEST_H 
  3.  
  4. void foo1(void); 
  5. void foo2(void); 
  6. void foo3(int i); 
  7.  
  8. #endif 

test.c

  1. void foo1(void){} 
  2. void foo2(void) {} 
  3. void foo3(int i){} 
  4.  
  5. int main(int argc,char** argv){ 
  6.   
  7.  foo1(); 
  8.  foo2(); 
  9.  foo3(1);  
  10.  return 0; 

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

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

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

添加extern "C"

test.h

  1. #ifndef TEST_H 
  2. #define TEST_H 
  3.  
  4. #ifdef __cplusplus 
  5. extern "C" { 
  6. #endif 
  7. void foo1(void); 
  8. void foo2(void); 
  9. void foo3(int i); 
  10.  
  11. #ifdef __cplusplus 
  12. #endif 
  13.  
  14. #endif 

test.c

  1. #ifdef __cplusplus 
  2. extern "C" { 
  3. #endif 
  4. void foo1(void){} 
  5. void foo2(void) {} 
  6. void foo3(int i){} 
  7. #ifdef __cplusplus 
  8. #endif 
  9.  
  10. int main(int argc,char** argv){ 
  11.   
  12.  foo1(); 
  13.  foo2(); 
  14.  foo3(1);  
  15.  return 0; 

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

  1. g++ -c test.c test.h 
  2.  
  3. objdump -t test.o 

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

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

好了,這次分享的比較簡單,也挺實用,我們下期再見。

本文轉載自微信公眾號「小麥大叔」,可以通過以下二維碼關注。轉載本文請聯系小麥大叔公眾號。

 

責任編輯:武曉燕 來源: 小麥大叔
相關推薦

2010-01-14 10:34:02

C++語言

2010-01-26 09:24:53

C++語言

2010-01-15 16:45:35

C++語言

2020-05-15 14:34:16

C語言丹尼斯 · 里奇開發者

2022-09-22 14:55:31

前端JavaScripthis

2022-09-26 13:10:17

JavaScriptthis

2009-09-02 17:04:35

C# Extern修飾

2010-01-14 13:24:49

CC++語言

2023-11-27 16:26:20

mainC語言

2010-01-20 17:23:03

C++編程語言

2023-11-27 19:35:01

C++extern

2022-08-22 15:32:59

C++C代碼

2021-02-19 07:59:21

數據埋點數據分析大數據

2022-09-28 18:16:34

JavaJDK

2019-06-03 10:14:07

API網關微服務

2021-05-13 10:40:16

ThreadLocal代碼Java

2020-08-05 12:17:00

C語言代碼分配

2024-08-22 08:17:55

C#工具循環

2009-06-05 10:24:37

C#排序排序

2025-03-27 10:30:51

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜视频导航 | 欧美视频区 | a视频在线 | 国产成人自拍av | 亚洲一区二区三区在线免费 | 日韩免费看片 | 国产精品揄拍一区二区久久国内亚洲精 | 伊人网站视频 | 国产极品粉嫩美女呻吟在线看人 | 国产精品99久久久久久宅男 | 久久久久久黄 | 日韩视频在线观看中文字幕 | 天天射天天干 | 91精品国产91久久久久青草 | 精品少妇一区二区三区日产乱码 | 在线观看特色大片免费网站 | 国产特级毛片aaaaaa喷潮 | 日韩欧美二区 | 精品91久久 | 日韩成人一区二区 | 不卡一二区 | 精品一区国产 | 日韩欧美一区二区在线播放 | 熟女毛片 | 日韩免费视频一区二区 | 国产福利91精品 | 久久久久久免费免费 | 永久免费视频 | 成人午夜在线 | 蜜桃臀av一区二区三区 | 国产精品美女久久久久久不卡 | 国产免费一级一级 | 一级a性色生活片久久毛片波多野 | 成人亚洲性情网站www在线观看 | 成人精品一区二区三区四区 | 91精品国产乱码久久久久久久久 | 亚洲一区| 四虎国产| 四虎永久影院 | 午夜精品一区二区三区在线视频 | 久久久久久国产精品免费免费 |