C與C 的相互呼叫問題

2021-06-27 01:13:20 字數 3320 閱讀 2325

extern "c"的雙重含義

extern 是c/c++ 語言中表明函式和全域性變數作用範圍(可見性)的關鍵字,該關鍵字告訴編譯器,其宣告的函式和變數可以在本模組或其它模組中使用。記住下列語句:

1   

extern int a;

2   c與c++的相互呼叫:

作為一種物件導向的語言,c++ 支援函式過載,而過程式語言c 則不支援。函式被c++ 編譯後在符號庫中的名字與c 語言的不同。

void foo(int x, int y);

該函式被c 編譯器編譯後在符號庫中的名字為_foo ,而c++ 編譯器則會產生像_foo_int_int之類的名字

extern "c"的慣用法

(1)在c++ 中引用c語言中的函式和變數,在包含c 語言標頭檔案(假設為example.h )時,需進行下列處理:

extern "c"

而在c 語言的標頭檔案中,對其外部函式只能指定為extern 型別,c

語言中不支援extern "c"宣告,在.c 檔案中包含了extern "c"

時會出現編譯語法錯誤

error: expected identifier or

『(』 beforestring constant)。

3   首先我們來看一下c++呼叫c語言的**

/* file testc.h */

#ifdef __cplusplus

extern "c"

#endif

/* file testc.c */

#include "testc.h

int add(int a, int b)

/* file testcpp.cpp */

#include "stdio.h"

#include "testc.h"                          注:cpp檔案中可以直接引用 .h 的標頭檔案

int main()

4   c 引用c++ 函式工程例子

/*  c++ code  */

extern "c" void f(int);  //

宣告

void f(int i)

/* c code: */

extern void f(int);   //

宣告

void cc(int i)

5下面我們就來看看如何在

c語言中使用

c++的**(

c++類的方法)。為了簡單起見,我將類的定義和實現放在乙個檔案中

(通常應該是將分別放在.h和

.cpp

檔案中)。

/* file testclass.h*/

classtest            //

定義類};

c++類封裝為

c函式的檔案(為了簡略也將宣告和實現放在了同乙個檔案中)如下:

/* file testcpp.cpp*/

#include "testclass.h"

extern "c" int add_cpp(int a,int b);

int add_cpp(int a, int b)

實際呼叫

c++**的

c檔案如下:

/*file testc.c */

#include "stdio.h"

extern intadd_cpp(int a, int b);  //

宣告cpp

中函式

int main()

上面的過程很清晰,就是用乙個函式將

c++類的使用封裝起來,然後將它外部宣告為

c函式就可以了。 檔案

testclass.h

定義並實現了乙個類,該類只有乙個

add方法。檔案

testcpp.cpp

定義並實現了乙個函式

add_cpp

,函式中定義了乙個test類物件並呼叫了該物件的

add方法。然後

add_cpp

函式進行外部宣告為

c

testc.c

檔案中為了使用

add_cpp

函式,也需要進行外部宣告。這是為了通知編譯器說明這個函式是在其他檔案中實現(注意在

c檔案中的

extern

後面不可加

」c」)。當這三個檔案一起編譯鏈結時,編譯器就可以找到

add_cpp

的具體實現。

C與C 之間相互呼叫

c與c 之間相互呼叫 1 匯出c函式以用於c或c 的專案 如果使用c語言編寫的dll,希望從中匯出函式給c或c 的模組訪問,則應使用 cplusplus 預處理器巨集確定正在編譯的語言。如果是從c 語言模組使用,則用c鏈結宣告這些函式。如果使用此技術並為dll提供標頭檔案,則這些函式可以原封不動地由...

C與C 之間相互呼叫

1 匯出c函式以用於c或c 的專案 如果使用c語言編寫的dll,希望從中匯出函式給c或c 的模組訪問,則應使用 cplusplus 預處理器巨集確定正在編譯的語言。如果是從c 語言模組使用,則用c鏈結宣告這些函式。如果使用此技術並為dll提供標頭檔案,則這些函式可以原封不動地由c和c 模組使用。以下...

C與C 之間相互呼叫

1 匯出c函式以用於c或c 的專案 如果使用c語言編寫的dll,希望從中匯出函式給c或c 的模組訪問,則應使用 cplusplus 預處理器巨集確定正在編譯的語言。如果是從c 語言模組使用,則用c鏈結宣告這些函式。如果使用此技術並為dll提供標頭檔案,則這些函式可以原封不動地由c和c 模組使用。以下...