C C 混合程式設計

2021-06-19 02:40:55 字數 3941 閱讀 8980

現在,我們就來慢慢的了解吧。

一、

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++混合程式設計的問題,可以聯絡我哦

親們,好好享受吧

C C 混合程式設計

c中呼叫c c 中呼叫c都會用到extern c 但兩者的意義卻大不一樣!例 c void foo int x c c code extern c void foo int x 讓c 聯結器能通過過類似於 foo來查詢此函式,而非類似於 foo int這樣的符號。使用extern c 則是告訴編譯器...

C C 混合程式設計

分類 linux c c 2012 12 26 09 51 655人閱讀收藏 舉報cc 混合程式設計 externc cplusplus 現在,我們就來慢慢的了解吧。一 extern c 的作用 最重點 1.extern c 的真實目的是實現類c和c 的混合程式設計。extern c 是由 提供的乙...

C C 混合程式設計

首先,混合程式設計不是指在同乙個檔案裡寫c 與c 混合程式設計包括 1 c 引用c 的標頭檔案 2,g 生成的.o與 gcc生成的 o相鏈結。1.extern c 的真實目的是實現類c和 c 的混合程式設計。extern c 是由 提供的乙個連線交換指定符號,用於告訴 這段 是 函式。extern ...