深入理解C/C++混合編程
在工作中,C、C++密不可分,做我們嵌入式方面的,當然更多的是C,但,有時候卻少不了C++,而且是C、C++混搭(混合編程)在一起的,比如,RTP視頻傳輸,live555多媒體播放等都是C++下的,他需要調用JRTPLIB庫,再比如,我那郵件發(fā)送,我也用C++寫的,定義了一個Email對象,包含了成員:收發(fā)郵件地址,用戶名,密碼等,以及方法:郵件頭、Base64編碼和郵件發(fā)送這些操作,很好用,所以,很多時候,C++還是蠻不錯的。。。。但,*.c與*.cpp文件混搭在一起,不是那么的簡單,知識總是:用時方恨少?。。?!現(xiàn)在,我們就來慢慢的了解吧。
一、extern“C”的作用(最重點)
1. extern "C"的真實目的是實現(xiàn)類C和C++的混合編程。extern “C”是由C++提供的一個連接交換指定符號,用于告訴C++這段代碼是C函數(shù)。extern “C”后面的函數(shù)不使用的C++的名字修飾,而是用C。這是因為C++編譯后庫中函數(shù)名會變得很長,與C生成的不一致,造成C++不能直接調用C函數(shù)。
2.C++語言支持函數(shù)重載,C語言不支持函數(shù)重載。函數(shù)被C++編譯后在庫中的名字與C語言的不同。假設某個函數(shù)的原型為:void foo(int x, int y);該函數(shù)被C編譯器編譯后在庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字。C++提供了C連接交換指定符號extern“C”來解決名字匹配問題。
3.被extern "C"限定的函數(shù)或變量是extern類型的;extern是C/C++語言中表明函數(shù)和全局變量作用范圍(可見性)的關鍵字,該關鍵字告訴編譯器,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。被extern "C"修飾的變量和函數(shù)是按照C語言方式編譯和連接的。
4.與extern對應的關鍵字是static,被它修飾的全局變量和函數(shù)只能在本模塊中使用。因此,一個函數(shù)或變量只可能被本模塊使用時,其不可能被extern “C”修飾。
二、extern“C”與__cplusplus
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
Cplusplus(C plus plus)即"C++",用于C++文檔的頭文件中,上面代碼的意思是:如果是C++文件(*.cpp)后綴,則使用extern “C”,在C++項目中應用的非常廣泛。即使用gcc編譯器編譯,函數(shù)名為C類型如_foo。個人認為,搞懂了這兩個關鍵字,尤其是理解extern "C"(再次強調,不為過,呵呵),接下來的混合編程也就差不多了,哈哈哈。。。。
三、C調用C++函數(shù)(接口)
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" {
#endif
class ANIMAL{
public:
ANIMAL(char* );
~ANIMAL();
char* getname(void);
private:
char* name;
};
void print(void);
#ifdef __cplusplus
}
#endif
#endif // __ANIMAL_H__
1.2 animal.cpp:C++文件
[root@localhost CC++]#cat animal.cpp
#include "animal.h"
#include <iostream>
using namespace std;
ANIMAL::ANIMAL(char* data)//構造函數(shù)
{ name = new char[64];
strcpy(name, data);
}
ANIMAL::~ANIMAL() //析構函數(shù)
{
if(name)
{
delete[] name;
name = NULL;
}
}
char* ANIMAL::getname(void)
{ return name;
}
void print(void) //對外接口,而且必須有一個非類中方法,才能被C調用
{
ANIMAL animal("dog");
char* animal_name = animal.getname();
cout << "animal name is :" << animal_name << endl;
}
1.3 main.c:C文件
[root@localhost CC++]#cat main.c
int main(void)
{ print();
return 0;
}
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生成可執(zhí)行程序main
[root@localhost CC++]#make
g++ -c animal.cpp
gcc -lstdc++ main.c animal.o -o main
2.2運行可執(zhí)行程序main
[root@localhost CC++]# ./main
animal name is :dog
四、C++調用C函數(shù)
應該這個比較簡單,我就不多寫了,就直接寫代碼。
共有三個文件: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 <stdio.h>
#include "1.h"
void print(char* data)
{
printf("%s\n", data);
}
[root@localhost aa]#cat main.cpp
extern "C"{
#include "1.h"}
int main(void)
{
print(“hello,world\n”);
return 0;
}
gcc –c 1.c
g++ main.cpp 1.o
接著./a.out,又可以出現(xiàn)我們神奇的hello,world了,C++調用C代碼很簡單,但C調用C++接口可把我給累壞了,苦啊。就是這個gcc后面跟的-lstdc++害的,出現(xiàn)undefined reference to `__gxx_personality_v0'這個錯誤。是因為你用gcc編譯.cpp文件(animal.cpp).按系統(tǒng)默認.cpp文件是c++的文件格式。當然,混搭時,我還遇到了其他的一些問題,都是一些小問題,如果上面解釋的還不足以讓你解決C\C++混合編程的問題,可以聯(lián)系我哦.
上一篇:解析Linux下的時間函數(shù):設置以及獲取時間的方法
欄 目:C語言
本文標題:深入理解C/C++混合編程
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4490.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解約瑟夫環(huán)的數(shù)學優(yōu)化方法
- 01-10深入二叉樹兩個結點的最低共同父結點的詳解
- 01-10深入理解C++中常見的關鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10深入第K大數(shù)問題以及算法概要的詳解
- 01-10深入解析最長公共子串
- 01-10c++中inline的用法分析
- 01-10深入理解鏈表的各類操作詳解


閱讀排行
本欄相關
- 04-02c語言函數(shù)調用后清空內存 c語言調用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調用函數(shù)求fibo C語言調用函數(shù)求
隨機閱讀
- 01-10C#中split用法實例總結
- 01-11ajax實現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改