NDK12_C與C++函數符號兼容

NDK開發彙總

C的大部分代碼可以在C++中直接使用,但是仍然有需要注意的地方。
如果需要在C++中調用C實現的庫中的方法
extern “C” //指示編譯器這部分代碼使用C的方式進行編譯而不是C++
``

  • 衆所周知,C是面向過程的語言,沒有函數重載。
void func(int x, int y);
  • 對於 func 函數 被C的編譯器編譯後在函數庫中的名字可能爲func(無參數符號),而C++編譯器則會產生類似funcii之類的名字。
  1. 有相同內容的文件
//main.c / main.cpp
int func(int x,int y){}
int main(){return 0;}
  1. 進行編譯
gcc main.c -o mainc.o
gcc main.cpp -o maincpp.o

nm -A mainc.o 
nm -A maincpp.o 
  1. 結果
    在這裏插入圖片描述
    在這裏插入圖片描述

  2. 那麼這樣導致的問題就在於: c的.h頭文件中定義了func函數,則.c源文件中實現這個函數符號都是func,然後拿到C++中使用,.h文件中的對應函數符號就被編譯成另一種,和庫中的符號不匹配,這樣就無法正確調用到庫中的實現。

因此,對於C庫可以:

#ifdef __cplusplus
extern "C"{
#endif
void func(int x,int y);
#ifdef __cplusplus    
}
#endif

//__cplusplus 是由c++編譯器定義的宏,用於表示當前處於c++環境

或者在C++ 引用C文件的地方

extern "C"{
	#include "lsn02.c"
}

extern 關鍵字 可用於變量或者函數之前,表示真實定義在其他文件,編譯器遇到此關鍵字就會去其他模塊查找

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