extern \x22C\x22

extern \x22C\x22

extern "C"的主要作用就是為了能夠正確實現C++代碼調用其他C語言代碼。加上extern "C"後,會指示編譯器這部分代碼按C語言的進行編譯,而不是C++的。由於C++支持函式重載,因此編譯器編譯函式的過程中會將函式的參數類型也加到編譯後的代碼中,而不僅僅是函式名;而C語言並不支持函式重載,因此編譯C語言代碼的函式時不會帶上函式的參數類型,一般只包括函式名。

基本介紹

  • 外文名:extern "C"
  • 用途:實現類C語言和C++語言的混合編程
概述,編譯方式,習慣用法,

概述

從字面上看:extern "C"有兩部分內容:extern和“C”,下面分別說明:
(1)extern
學過C或C++的人都知道,extern是程式語言中的一種屬性,它表征了變數、函式等類型的作用域(可見性)屬性,是程式語言中的關鍵字。當進行編譯時,該關鍵字告訴編譯器它所聲明的函式和變數等可以在本模組或者檔案以及其他模組或檔案中使用。通常,程式設計師都只是在“*.h”(頭檔案)中使用該關鍵字以限定變數或函式等類型的屬性,然後在其他模組或本模組中使用,如:
file1.h
extern int i;
file2.c /*其他檔案調用該變數*/
void welcome(void){    if(i > 0)        printf("Hello World!\n");}
(2)“C”
程式語言種類繁多各有優劣,因此在做軟體工程時,往往會出現不同語言嵌套或互相調用的情況,例如在C和C++之間就經常出現互相調用。雖然C++是C的超集,但是,它們之間的編譯器是不同的,這就產生了各自的編譯器在對C和C++進行編譯時要依據哪一個作為大家都認可的規範或者約定的問題。很幸運的是,通過一些基礎特徵我們制定了這樣的一個規約,這就是“C”的出處,這些基礎特徵就是:
1)這種調用編譯是一種“超”連結;
2)這種調用編譯不能影響現有的編譯規範;
3)C++是C的拓展,是C的升華。
根據1),extern關鍵字可以表達這種“超”連結;根據2)、3)用“C”來規約在C++中對C的編譯。
因此,extern "C"表明了一種編譯規約,其中extern是關鍵字屬性,“C”表征了編譯器連結規範。對於extern "C"可以理解成在C++/C中的混合編程的編譯指令。
明白了這層意思,下面的代碼就不難解釋了:
#ifdef __cplusplus /* 如果採用了C++,如下代碼使用C編譯器 */    extern "C" { /* 如果沒有採用C++,順序預編譯 */#endif/* 採用C編譯器編譯的C語言代碼段 */#ifdef __cplusplus /* 結束使用C編譯器 */    }#endif

編譯方式

未加extern “C”聲明時的編譯方式
首先看看C++中對類似C的函式是怎樣編譯的。
作為一種面向對象的語言,C++支持函式重載,而過程式語言C則不支持。函式被C++編譯後在符號庫中的名字與C語言的不同。例如,假設某個函式的原型為:
void foo(int x, int y);
該函式被C編譯器編譯後在符號庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字(不同的編譯器可能生成的名字不同,但是都採用了相同的機制,生成的新名字稱為“mangledname”)。_foo_int_int這樣的名字包含了函式名、函式參數數量及類型信息,C++就是靠這種機制來實現函式重載的。例如,在C++中,函式void foo( int x, int y )與void foo( int x, float y)編譯生成的符號是不相同的,後者為_foo_int_float。

相關詞條

熱門詞條

聯絡我們