extern "c" char* strcpy(char*,const char*);
注意它與下面的宣告的不同之處:
extern char* strcpy(char*,const char*);
下面的這個宣告僅表示在連線的時候呼叫strcpy()。
extern "c"指令非常有用,因為c和c++的近親關係。注意:extern "c"指令中的c,表示的一種編譯和連線規約,而不是一種語言。c表示符合c語言的編譯和連線規約的任何語言,如fortran、assembler等。
還有要說明的是,extern "c"指令僅指定編譯和連線規約,但不影響語義。例如在函式宣告中,指定了extern "c",仍然要遵守c++的型別檢測、引數轉換規則。
通過上面兩節的分析,我們知道extern "c"的真實目的是實現類c和c++的混合程式設計。在c++原始檔中的語句前面加上extern "c",表明它按照類c的編譯和連線規約來編譯和連線,而不是c++的編譯的連線規約。這樣在類c的**中就可以呼叫c++的函式or變數等。(注:我在這裡所說的類c,代表的是跟c語言的編譯和連線方式一致的所有語言)
c++中呼叫c的**
假設乙個c的標頭檔案cheader.h中包含乙個函式print(int i),為了在c++中能夠呼叫它,必須要加上extern關鍵字(原因在extern關鍵字那節已經介紹)。它的**如下:
#ifndef c_header
#define c_header
extern void print(int i);
#endif c_header
相對應的實現檔案為cheader.c的**為:
#include #include "cheader.h"
void print(int i)
現在c++的**檔案c++.cpp中引用c中的print(int i)函式:
extern "c"
int main(int argc,char** argv)
c中呼叫c++的**
現在換成在c中呼叫c++的**,這與在c++中呼叫c的**有所不同。如下在cppheader.h標頭檔案中定義了下面的**:
#ifndef cpp_header
#define cpp_header
extern "c" void print(int i);
#endif cpp_header
相應的實現檔案cppheader.cpp檔案中**如下:
#include "cppheader.h"
#include using namespace std;
void print(int i)
注意在c的**檔案中直接#include "cppheader.h"標頭檔案,編譯出錯。而且如果不加extern int print(int i)編譯也會出錯。
當我們c和c++混合程式設計時,有時候會用一種語言定義函式指標,而在應用中將函式指標指向另一中語言定義的函式。如果c和c++共享同一中編譯和連線、函式呼叫機制,這樣做是可以的。然而,這樣的通用機制,通常不然假定它存在,因此我們必須小心地確保函式以期望的方式呼叫。
個人實踐中碰到的經驗:
比如drv層的傳送函式tx()是由cpp檔案內實現的,tp層需要用到這個函式,本來tp是由c實現的,但是把檔名改為cpp整個tp就變成了cpp實現,那麼現在tp內呼叫tx()這個函式就相當於cpp呼叫cpp,但是有一點要注意,因為原來tp是c實現的,所以h檔案內的函式宣告都加了extern "c" {},所以需要把tx()函式放到extern "c" {}外面,否則就會產生鏈結錯誤說找不到tx()這個函式。
混合呼叫服務
1.呼叫服務放在oncreat 中或把返回服務的內容放在conn中 2.既要保證服務長期後台執行,又要呼叫服務裡面的方法 3.混合呼叫的服務的生命週期 服務長期後台執行,又想呼叫服務的方法 1.start方式開啟服務 保證服務長期後台執行 2.bind方式繫結服務 保證呼叫服務的方法 3.unbin...
變數和函式混合呼叫
第一部分 c 呼叫c變數或函式 如果我想在c檔案中實現某些功能,在cpp檔案實現對這些功能的呼叫,我該如何做呢?先將程式貼出來,然後在分析 cpp view plain copy file name inct.h ifndef inct h define inct h define num 8 if...
C 與C變數或函式的混合呼叫
第一部分 c 呼叫c變數或函式 如果我想在c檔案中實現某些功能,在cpp檔案實現對這些功能的呼叫,我該如何做呢?先將程式貼出來,然後在分析 cpp view plain copy file name inct.h ifndef inct h define inct h define num 8 if...