自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

[[410586]]

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

我經(jīng)常在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混合編程的時(shí)候,為了防止C++的編譯器在編譯C文件的時(shí)候出現(xiàn)錯(cuò)誤;

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

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

語言 描述
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

  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; 

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

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

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

添加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; 

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

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

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

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

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

本文轉(zhuǎn)載自微信公眾號(hào)「小麥大叔」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系小麥大叔公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: 小麥大叔
相關(guān)推薦

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語言丹尼斯 · 里奇開發(fā)者

2009-09-02 17:04:35

C# Extern修飾

2010-01-14 13:24:49

CC++語言

2023-11-27 16:26:20

mainC語言

2022-09-22 14:55:31

前端JavaScripthis

2022-09-26 13:10:17

JavaScriptthis

2010-01-20 17:23:03

C++編程語言

2023-11-27 19:35:01

C++extern

2022-08-22 15:32:59

C++C代碼

2019-06-03 10:14:07

API網(wǎng)關(guān)微服務(wù)

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

數(shù)據(jù)埋點(diǎn)數(shù)據(jù)分析大數(shù)據(jù)

2024-08-22 08:17:55

C#工具循環(huán)

2009-06-05 10:24:37

C#排序排序

2025-03-27 10:30:51

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)