《C++ Primer》讀書筆記(7.7)

鏈接指示符 extern "C" 

程序員用鏈接指示符[linkage directive] 告訴編譯器 該函數是用其他的程序設計語言編寫的

        // 單一語句形式的鏈接指示符 
        extern "C" void exit(int); 

        // 複合語句形式的鏈接指示符 
        extern "C" { 
              int printf( const char* ... ); 
              int scanf( const char* ... ); 
        } 
        // 複合語句形式的鏈接指示符 
        extern "C" { 
        #include <cmath> 
        } 

鏈接指示符不能出現在函數體中 下列代碼段將會導致編譯錯誤 
        int main() 
        { 
              // 錯誤 :鏈接指示符不能出現在函數內 
              extern "C" double sqrt( double ); 
            double getValue();  //ok 
              double result = sqrt ( getValue() ); 
              //... 


              return 0; 
         } 

    如果把鏈接指示符移到函數體外 程序編譯將無錯誤 

        extern "C" double sqrt( double ); 
        int main() 
         { 
              double getValue();  //ok 
              double result = sqrt ( getValue() ); 
              //... 
              return 0; 
         } 


   如果我們希望C++函數能夠爲C 程序所用,又該怎麼辦呢?我們也可以使用extern "C" 鏈接指示符來使C++函數爲C 程序可用

例如 

  // 函數 calc() 可以被 C程序調用 
        extern "C" double calc( double dparm ) { /* ... */ } 

============外鏈補充==============from http://blog.chinaunix.net/uid-24118190-id-2985318.html

用主程序的C調用C++的功能函數時總是提示該函數未定義(undefined)。這是什麼問題?如何解決?

關鍵點在這裏:我們就靠在C++的*.h和*.cpp的頭尾加入下面代碼才得以解決問題。

#ifdef __cplusplus 
extern "C" { 
#endif

//一段代碼

#ifdef __cplusplus 
} 
#endif

 其中 __cplusplus是cpp中的自定義宏。上面的代碼的含義是:如果這是一段cpp的代碼,那麼加入extern "C"{和}處理其中的代碼要明白爲何使用extern "C",還得從cpp中對函數的重載處理開始說起。在c++中,爲了支持重載機制,在編譯生成的彙編碼中,要對函數的名字進行一些處理,加入比如函數的返回類型等等.而在C中,只是簡單的函數名字而已,不會加入其他的信息.也就是說:C++和C對產生的函數名字的處理是不一樣的.  加入 extern "C" 聲明的目的是解決C與C++的相互調用的問題。

文件c.h:
#ifndef _c_h_
#define _c_h_
#ifdef __cplusplus
extern "C" {
#endif
void C_fun();
#ifdef __cplusplus
}
#endif
#endif
-----------------------------------
文件c.c:
#include "c.h"
void C_fun()
{
}
------------------------------------
在文件cpp.cpp中調用文件c.c中的函數C_fun()
cpp.cpp的實現
#include "c.h"
int main()
{
     C_fun()
}
其中__cplusplus是C++編譯器的保留宏定義.就是說C++編譯器認爲這個宏已經定義了.
所以關鍵是extern "C" {}   
extern "C"是告訴C++編譯器件括號裏的東東是按照C的obj文件格式編譯的,要連接的話按照C的命名規則去找.

=========================

      

發佈了35 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章