亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入理解C/C++混合編程

 更新時(shí)間:2013年05月27日 09:14:29   作者:  
本篇文章是對(duì)C/C++混合編程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
在工作中,CC++密不可分,做我們嵌入式方面的,當(dāng)然更多的是C,但,有時(shí)候卻少不了C++,而且是CC++混搭(混合編程)在一起的,比如,RTP視頻傳輸,live555多媒體播放等都是C++下的,他需要調(diào)用JRTPLIB庫(kù),再比如,我那郵件發(fā)送,我也用C++寫(xiě)的,定義了一個(gè)Email對(duì)象,包含了成員:收發(fā)郵件地址,用戶名,密碼等,以及方法:郵件頭、Base64編碼和郵件發(fā)送這些操作,很好用,所以,很多時(shí)候,C++還是蠻不錯(cuò)的。。。。但,*.c*.cpp文件混搭在一起,不是那么的簡(jiǎn)單,知識(shí)總是:用時(shí)方恨少?。。?!現(xiàn)在,我們就來(lái)慢慢的了解吧。

一、extern“C”的作用(最重點(diǎn))

    1. extern "C"的真實(shí)目的是實(shí)現(xiàn)類(lèi)CC++的混合編程。extern “C”是由C++提供的一個(gè)連接交換指定符號(hào),用于告訴C++這段代碼是C函數(shù)。extern “C”后面的函數(shù)不使用的C++的名字修飾,而是用C。這是因?yàn)?/SPAN>C++編譯后庫(kù)中函數(shù)名會(huì)變得很長(zhǎng),與C生成的不一致,造成C++不能直接調(diào)用C函數(shù)。

    2.C++語(yǔ)言支持函數(shù)重載,C語(yǔ)言不支持函數(shù)重載。函數(shù)被C++編譯后在庫(kù)中的名字與C語(yǔ)言的不同。假設(shè)某個(gè)函數(shù)的原型為:void foo(int x, int y);該函數(shù)被C編譯器編譯后在庫(kù)中的名字為_foo,而C++編譯器則會(huì)產(chǎn)生像_foo_int_int之類(lèi)的名字。C++提供了C連接交換指定符號(hào)extern“C”來(lái)解決名字匹配問(wèn)題。

    3.extern "C"限定的函數(shù)或變量是extern類(lèi)型的;externC/C++語(yǔ)言中表明函數(shù)和全局變量作用范圍(可見(jiàn)性)的關(guān)鍵字,該關(guān)鍵字告訴編譯器,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。被extern "C"修飾的變量和函數(shù)是按照C語(yǔ)言方式編譯和連接的。   

     4.與extern對(duì)應(yīng)的關(guān)鍵字是static,被它修飾的全局變量和函數(shù)只能在本模塊中使用。因此,一個(gè)函數(shù)或變量只可能被本模塊使用時(shí),其不可能被extern “C”修飾。

二、extern“C”__cplusplus

#ifdef __cplusplus
       extern "C" {
       #endif
       #ifdef __cplusplus
       }
       #endif
    CplusplusC plus plus"C++",用于C++文檔的頭文件中,上面代碼的意思是:如果是C++文件(*.cpp)后綴,則使用extern “C”,在C++項(xiàng)目中應(yīng)用的非常廣泛。即使用gcc編譯器編譯,函數(shù)名為C類(lèi)型如_foo。個(gè)人認(rèn)為,搞懂了這兩個(gè)關(guān)鍵字,尤其是理解extern "C"(再次強(qiáng)調(diào),不為過(guò),呵呵),接下來(lái)的混合編程也就差不多了,哈哈哈。。。。

三、C調(diào)用C++函數(shù)(接口)

1.設(shè)計(jì)程序,共四個(gè)文件

animal.cpp animal.h  main.c Makefile

1.1 animal.h

[root@localhost CC++]#cat animal.h
#ifndef __ANIMAL_H__  //防止被重復(fù)包含
#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.cppC++文件

[root@localhost CC++]#cat animal.cpp
#include "animal.h"
#include <iostream>
using namespace std;
ANIMAL::ANIMAL(char* data)//構(gòu)造函數(shù)
{       name = new char[64];
        strcpy(name, data);
}
ANIMAL::~ANIMAL() //析構(gòu)函數(shù)

{
        if(name)
        {

                delete[] name;
                name = NULL;
        }
}
char* ANIMAL::getname(void)
{        return name;
}
void print(void) //對(duì)外接口,而且必須有一個(gè)非類(lèi)中方法,才能被C調(diào)用
{
        ANIMAL animal("dog");
        char* animal_name = animal.getname();
        cout << "animal name is :" << animal_name << endl;
}

1.3 main.cC文件

[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.測(cè)試

2.1生成可執(zhí)行程序main

[root@localhost CC++]#make
g++ -c animal.cpp
gcc -lstdc++ main.c animal.o -o main

2.2運(yùn)行可執(zhí)行程序main

[root@localhost CC++]# ./main
animal name is :dog

四、C++調(diào)用C函數(shù)

應(yīng)該這個(gè)比較簡(jiǎn)單,我就不多寫(xiě)了,就直接寫(xiě)代碼。
共有三個(gè)文件: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++調(diào)用C代碼很簡(jiǎn)單,但C調(diào)用C++接口可把我給累壞了,苦啊。就是這個(gè)gcc后面跟的-lstdc++害的,出現(xiàn)undefined reference to `__gxx_personality_v0'這個(gè)錯(cuò)誤。是因?yàn)槟阌?SPAN>gcc編譯.cpp文件(animal.cpp.按系統(tǒng)默認(rèn).cpp文件是c++的文件格式。當(dāng)然,混搭時(shí),我還遇到了其他的一些問(wèn)題,都是一些小問(wèn)題,如果上面解釋的還不足以讓你解決C\C++混合編程的問(wèn)題,可以聯(lián)系我哦.

相關(guān)文章

  • C++ 迭代器失效問(wèn)題解決

    C++ 迭代器失效問(wèn)題解決

    在C++中,當(dāng)一個(gè)vector進(jìn)行了插入或刪除操作時(shí),其迭代器可能會(huì)失效,本文就來(lái)介紹一下C++ 迭代器失效問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • C語(yǔ)言的函數(shù)概念與規(guī)則你了解嗎

    C語(yǔ)言的函數(shù)概念與規(guī)則你了解嗎

    這篇文章主要介紹了C語(yǔ)言中的函數(shù)概念與規(guī)則,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-08-08
  • vscode和cmake編譯多個(gè)C++文件的實(shí)現(xiàn)方法

    vscode和cmake編譯多個(gè)C++文件的實(shí)現(xiàn)方法

    這篇文章主要介紹了vscode和cmake編譯多個(gè)C++文件的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • opencv實(shí)現(xiàn)圖像平移

    opencv實(shí)現(xiàn)圖像平移

    這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)圖像平移,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語(yǔ)言結(jié)構(gòu)體計(jì)算內(nèi)存占用問(wèn)題解析

    C語(yǔ)言結(jié)構(gòu)體計(jì)算內(nèi)存占用問(wèn)題解析

    這篇文章主要介紹了C語(yǔ)言結(jié)構(gòu)體計(jì)算內(nèi)存占用問(wèn)題解析,本文通過(guò)案例來(lái)解析了C語(yǔ)言計(jì)算結(jié)構(gòu)體內(nèi)存的方式和方法,需要的朋友可以參考下
    2021-07-07
  • C++實(shí)現(xiàn)LeetCode(76.最小窗口子串)

    C++實(shí)現(xiàn)LeetCode(76.最小窗口子串)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(76.最小窗口子串),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言數(shù)組全面詳細(xì)講解

    C語(yǔ)言數(shù)組全面詳細(xì)講解

    數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類(lèi)型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類(lèi)型相同,而且在計(jì)算機(jī)內(nèi)存里連續(xù)存放,地址編號(hào)最低的存儲(chǔ)單元存放數(shù)組的起始元素,地址編號(hào)最高的存儲(chǔ)單元存放數(shù)組的最后一個(gè)元素
    2022-05-05
  • 使用C語(yǔ)言來(lái)解決循環(huán)隊(duì)列問(wèn)題的方法

    使用C語(yǔ)言來(lái)解決循環(huán)隊(duì)列問(wèn)題的方法

    這篇文章主要介紹了使用C語(yǔ)言來(lái)解決循環(huán)隊(duì)列問(wèn)題的方法,來(lái)自ACM的練習(xí)題實(shí)例,需要的朋友可以參考下
    2015-08-08
  • C語(yǔ)言中進(jìn)程信號(hào)集的相關(guān)操作函數(shù)詳解

    C語(yǔ)言中進(jìn)程信號(hào)集的相關(guān)操作函數(shù)詳解

    這篇文章主要介紹了C語(yǔ)言中進(jìn)程信號(hào)集的相關(guān)操作函數(shù)詳解,包括sigismember函數(shù)和sigfillset函數(shù)以及sigemptyset函數(shù)的用法,需要的朋友可以參考下
    2015-09-09
  • c++中的stack和dequeue解析

    c++中的stack和dequeue解析

    這篇文章主要介紹了c++中的stack和dequeue介紹,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05

最新評(píng)論