c++ 知識點--extern "C"的作用

因爲C、C++的編譯器對函數名的修飾不同,爲了保證在C、C++中編寫的函數能夠被互相調用,所以採用這個鏈接指示符

以int func(int, int)爲例,C的編譯器會將名字改編爲_func, 而C++的編譯器會改編爲_func_int_int 或_funcii(各編譯器不同)。

如果這個函數在C中編譯成庫,目標文件中函數名爲_func,當這個函數中C++中被調用時,C++ 的編譯器就會到目標文件中
尋找_funcii,結果找不到,出錯。
所以爲了防止這種問題,在C++調用時,將函數聲明前加個extern "C" 告訴C++的編譯器,不要
對名字再進修飾,而直接去找_func。

同樣在C++中編譯的函數,如果想讓C來使用,通常也加上extern "C"在編譯時將函數名按C的風格進行修飾。

通常C中編寫的函數如果有在其它語言中使用的可能,通常會有下面形式的聲明:
#ifdef  __cplusplus

extern "C" {

#endif

/**** some declaration or so *****/

#ifdef  __cplusplus

    }

#endif  /* end of __cplusplus */

即在聲明時已經加上extern "C" 而不需要調用時麻煩。例如在VC++中調用C的庫函數就不用作特別的聲明。

extern "C"的使用要點
1. 可以是單一語句
    extern "C" double sqrt(double);
2. 可以是複合語句, 相當於複合語句中的聲明都加了extern "C"
    extern "C" 
   {
      double sqrt(double);
      int min(int, int);
  }
3.可以包含頭文件,相當於頭文件中的聲明都加了extern "C"
   extern "C"
  {
    #i nclude <cmath>
  }
4. 不可以將extern "C" 添加在函數內部
5. 如果函數有多個聲明,可以都加extern "C", 也可以只出現在第一次聲明中,後面的聲明會接受第一個鏈接指示符的規則。
6. 除extern "C", 還有extern "FORTRAN" 等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章