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 模組使用。以下...