一、extern「c」的作用(最重點)
1. extern "c"的真實目的是實現類c和c++的混合程式設計。extern 「c」是由c++提供的乙個連線交換指定符號,用於告訴c++這段**是c函式。extern 「c」後面的函式不使用的c++的名字修飾,而是用c。這是因為c++編譯後庫中函式名會變得很長,與c生成的不一致,造成c++不能直接呼叫c函式。
2.c++語言支援函式過載,c語言不支援函式過載。函式被c++編譯後在庫中的名字與c語言的不同。假設某個函式的原型為:void foo(int x, int y);該函式被c編譯器編譯後在庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字。c++提供了c連線交換指定符號extern「c」來解決名字匹配問題。
3.被extern "c"限定的函式或變數是extern型別的;extern是c/c++語言中表明函式和全域性變數作用範圍(可見性)的關鍵字,該關鍵字告訴編譯器,其宣告的函式和變數可以在本模組或其它模組中使用。被extern "c"修飾的變數和函式是按照c語言方式編譯和連線的。
4.與extern對應的關鍵字是static,被它修飾的全域性變數和函式只能在本模組中使用。因此,乙個函式或變數只可能被本模組使用時,其不可能被extern 「c」修飾。
二、extern「c」與__cplusplus
#ifdef __cplusplus
extern "c"
#endif
cplusplus(c plus plus)即"c++",用於c++文件的標頭檔案中,上面**的意思是:如果是c++檔案(*.cpp)字尾,則使用extern 「c」,在c++專案中應用的非常廣泛。即使用gcc編譯器編譯,函式名為c型別如_foo。個人認為,搞懂了這兩個關鍵字,尤其是理解extern "c"(再次強調,不為過,呵呵),接下來的混合程式設計也就差不多了,哈哈哈。。。。
三、c呼叫c++函式(介面)
1.設計程式,共四個檔案
animal.cpp animal.h main.c makefile
1.1 animal.h
[root@localhost cc++]#cat animal.h
#ifndef __animal_h__//防止被重複包含
#define __animal_h__
#ifdef __cplusplus
extern "c" ;
void print(void);
#ifdef __cplusplus
}#endif
#endif // __animal_h__
1.2 animal.cpp:c++檔案
[root@localhost cc++]#cat animal.cpp
#include "animal.h"
#include
using namespace std;
animal::animal(char* data)//建構函式
animal::~animal()//析構函式}
char* animal::getname(void)
voidprint(void)//對外介面,而且必須有乙個非類中方法,才能被c呼叫
1.3 main.c:c檔案
[root@localhost cc++]#cat main.c
int main(void)
1.4 makefile
[root@localhost cc++]#cat makefile
main:main.c animal.o
gcc-lstdc++main.c animal.o -o main
animal.o:animal.h
g++ -c animal.cpp
.phony : clean
clean:
-rm animal.o main
2.測試
2.1生成可執行程式main
[root@localhost cc++]#make
g++ -c animal.cpp
gcc -lstdc++ main.c animal.o -o main
2.2執行可執行程式main
[root@localhost cc++]#./main
animal name is :dog
四、c++呼叫c函式
應該這個比較簡單,我就不多寫了,就直接寫**。
共有三個檔案:1.h 1.c main.cpp
[root@localhost aa]#cat 1.h
#ifndef _1__h_
#define _1__h_
extern void print(char* );
#endif
[root@localhost aa]#cat 1.c
#include
#include "1.h"
void print(char* data)
[root@localhost aa]#cat main.cpp
extern "c"
int main(void)
gcc –c 1.c
g++ main.cpp 1.o
接著./a.out,又可以出現我們神奇的hello,world了,c++呼叫c**很簡單,但c呼叫c++介面可把我給累壞了,苦啊。就是這個gcc後面跟的-lstdc++害的,出現undefined reference to `__gxx_personality_v0'這個錯誤。是因為你用gcc編譯.cpp檔案(animal.cpp).按系統預設.cpp檔案是c++的檔案格式。
C與C 混合程式設計 編譯
1.工程檔案架構 drwxrwxr x 3 joshyoby joshyoby 4096 2月 25 15 03 drwxrwxr x 8 joshyoby joshyoby 4096 2月 25 14 45 rw rw r 1 joshyoby joshyoby 671 2月 25 14 58 m...
c與c 的混合編譯
記錄一次意外經歷 在c 函式中使用c 在函式前加上extern c 來註明 extern c 的主要作用就是為了能夠正確實現c 呼叫其他c語言 加上extern c 後,會指示編譯器這部分 按c語言的進行編譯,而不是c 的。由於c 支援函式過載,因此編譯器編譯函式的過程中會將函式的引數型別也加到編譯...
c和c 混合編譯的問題(extern C )
1.引言 c 語言的建立初衷是 a better c 但是這並不意味著c 中類似c語言的全域性變數和函式所採用的編譯和連線方式與c語言完全相同。作為一種欲與c相容的語言,c 保留了一部分過程式語言的特點 被世人稱為 不徹底地物件導向 因而它可以定義不屬於任何類的全域性變數和函式。但是,c 畢竟是一種...