程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 第18章 特殊工具與技術(14)

第18章 特殊工具與技術(14)

編輯:C++入門知識

18.7.3 鏈接指示:extern “c”

C++使用鏈接指示(linkage directive)指出任意非C++函數所用的語言。

1. 聲明非C++函數

鏈接指示有兩種形式:單個的或復合的。鏈接指示不能出現在類定義或函數定義的內部,它必須出現在函數的第一次聲明上。

[cpp] #include <cstdlib>  
extern "C" size_t strlen(const char*); 
extern "C" {int strcmp(const char*,const char*); 
char *strcat(char*,const char*);} 
#include <cstdlib>
extern "C" size_t strlen(const char*);
extern "C" {int strcmp(const char*,const char*);
char *strcat(char*,const char*);}第一種形式由關鍵字extern後接字符串字面值,再接“普通”函數聲明構成。字符串字面值指出編寫函數所用的語言。

通過將幾個函數的聲明放在跟在鏈接指示之後的花括號內部,可以給他們設定相同的鏈接。花括號的作用是將應用鏈接所示的聲明聚合起來,忽略了花括號,花括號中聲明的函數名就是可見的,就像在花括號之外聲明函數一樣。

2. 鏈接指示與頭文件

可以將多重聲明形式應用與整個頭文件。

[cpp] extern "C"{ 
#include <string.h>  

extern "C"{
#include <string.h>
}允許將C++從C函數庫繼承而來的函數定義為C函數,擔不是必須定義為C函數——決定是用C還是用C++實現C函數庫,是每個C++實現的事情。

3. 導出C++函數到其他語言

[cpp] extern "C" double calc(double dparm){ 
    return 0.0; 

extern "C" double calc(double dparm){
 return 0.0;
}通過對函數定義使用鏈接指示,使得用其他語言編寫的程序可以使用C++函數。

用鏈表指示定義的函數的每個聲明都必須使用相同的鏈接指示。

4. 鏈接指示支持的語言

要求編譯器支持對C語言的鏈接指示,編譯器可以為其他語言提供鏈接說明。例如,extern "Ada"、extern "FORTRAM"等。

5. 重載函數與鏈接指示

鏈接指示與函數重載之間的相互作用依賴於目標語言。如果語言支持重載函數,則為該語言實現鏈接指示的編譯器很可能也支持C++的這些函數的重載。

C++保證支持的唯一語言是C。C語言不支持函數重載,所以,不應該對下面的情況感到驚訝:在一組重載函數中只能為一個C函數指定鏈接指示。用給定名字的C鏈接聲明多於一個函數是錯誤的。

在C++程序中,重載C函數很常見,但是,重載集合中的其他函數必須都是C++函數。

6. extern “C”函數的指針

編寫函數所用的語言是函數類型的一部分。為了聲明用其他程序設計語言編寫的函數的指針,必須使用鏈接指示。

C函數的指針與C++函數的指針具有不同的類型,不能將C函數的指針初始化或賦值為C++函數的指針。


 摘自 xufei96的專欄
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved