成人免费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語言丹尼斯 · 里奇開發者

2009-09-02 17:04:35

C# Extern修飾

2022-09-22 14:55:31

前端JavaScripthis

2022-09-26 13:10:17

JavaScriptthis

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-05-13 10:40:16

ThreadLocal代碼Java

2020-08-05 12:17:00

C語言代碼分配

2022-09-28 18:16:34

JavaJDK

2021-02-19 07:59:21

數據埋點數據分析大數據

2019-06-03 10:14:07

API網關微服務

2024-08-22 08:17:55

C#工具循環

2025-03-27 10:30:51

2009-06-05 10:24:37

C#排序排序
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 操久久| 久久毛片 | 日韩在线成人 | 亚洲欧美高清 | 久久天天躁狠狠躁夜夜躁2014 | 亚洲综合二区 | 黄色大片毛片 | 日韩中文字幕在线观看 | 欧美日韩精品久久久免费观看 | 国产乱精品一区二区三区 | 国产亚洲精品久久久久久牛牛 | 久久久久国产精品 | 精品欧美一区免费观看α√ | 一级黄色大片 | 国产精品成人一区二区三区 | 日本黄色大片免费 | 影音先锋男 | 久久亚洲一区二区三 | 一区二区三区精品视频 | 久久精品国产亚洲一区二区三区 | 亚洲视频一区二区三区四区 | 久久亚洲春色中文字幕久久久 | 久色视频在线观看 | 99精品国自产在线 | 九九视频在线观看 | 蜜臀久久 | 国产精品欧美一区二区三区 | 久久国内精品 | 久久精片 | 久久亚洲精品国产精品紫薇 | 午夜视频一区 | 欧美日韩亚洲在线 | 久久久久久亚洲精品 | 欧美精品一区二区三区蜜桃视频 | 日韩国产在线 | www.亚洲精品| 日韩手机在线视频 | 日韩一区二区三区在线 | 亚洲一区不卡在线 | 亚洲国产欧美国产综合一区 | 久久久久一区二区 |