C和C 混合呼叫

2021-07-05 21:14:00 字數 1991 閱讀 9204

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...