偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

[[410586]]

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

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

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

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

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

未添加 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查看函數(shù)符號;

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

可以看到函數(shù)符號已經(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; 

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

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

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

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

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

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

 

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

2010-01-14 10:34:02

C++語言

2020-05-15 14:34:16

C語言丹尼斯 · 里奇開發(fā)者

2010-01-26 09:24:53

C++語言

2009-09-02 17:04:35

C# Extern修飾

2010-01-15 16:45:35

C++語言

2010-01-14 13:24:49

CC++語言

2022-09-26 13:10:17

JavaScriptthis

2022-09-22 14:55:31

前端JavaScripthis

2010-01-20 17:23:03

C++編程語言

2023-11-27 16:26:20

mainC語言

2023-11-27 19:35:01

C++extern

2019-06-03 10:14:07

API網(wǎng)關微服務

2022-08-22 15:32:59

C++C代碼

2022-09-28 18:16:34

JavaJDK

2020-08-05 12:17:00

C語言代碼分配

2021-05-13 10:40:16

ThreadLocal代碼Java

2009-06-05 10:24:37

C#排序排序

2024-08-22 08:17:55

C#工具循環(huán)

2021-02-19 07:59:21

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

2025-03-27 10:30:51

點贊
收藏

51CTO技術棧公眾號