C/C++混合编程

 

[置顶] C/C++混合编程

分类: Linux/c/c++   655人阅读  评论(10)  收藏  举报

    在工作中,CC++密不可分,做我们嵌入式方面的,当然更多的是C,但,有时候却少不了C++,而且是CC++混搭(混合编程)在一起的,比如,RTP视频传输,live555多媒体播放等都是C++下的,他需要调用JRTPLIB库,再比如,我那邮件发送,我也用C++写的,定义了一个Email对象,包含了成员:收发邮件地址,用户名,密码等,以及方法:邮件头、Base64编码和邮件发送这些操作,很好用,所以,很多时候,C++还是蛮不错的。。。。但,*.c*.cpp文件混搭在一起,不是那么的简单,知识总是:用时方恨少啊!!!现在,我们就来慢慢的了解吧。大笑

 

一、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

 

       #ifdef __cplusplus

       }

       #endif

    CplusplusC 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" {

#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)//构造函数

{

        name = new char[64];

        strcpy(name, data);

}

ANIMAL::~ANIMAL() //析构函数

{

        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.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.测试

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 <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,又可以出现我们神奇的hello,world了,C++调用C代码很简单,但C调用C++接口可把我给累坏了,苦啊。就是这个gcc后面跟的-lstdc++害的哭,出现undefined reference to `__gxx_personality_v0'这个错误。是因为你用gcc编译.cpp文件(animal.cpp.按系统默认.cpp文件是c++的文件格式。当然,混搭时,我还遇到了其他的一些问题,都是一些小问题,如果上面解释的还不足以让你解决C\C++混合编程的问题,可以联系我哦吐舌头,哎,我总算--终于见到太阳了。

 

亲们,好好享受吧微笑。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

 

 

 

本项目构建于RASA开源架构之上,旨在实现一个具备多模态交互能力的智能对话系统。该系统的核心模块涵盖自然语言理解、语音转文本处理以及动态对话流程控制三个主要方面。 在自然语言理解层面,研究重点集中于增强连续对话中的用户目标判定效能,并运用深度神经网络技术提升关键信息提取的精确度。目标判定旨在解析用户话语背后的真实需求,从而生成恰当的反馈;信息提取则专注于从语音输入中析出具有特定意义的要素,例如个体名称、空间位置或时间节点等具体参数。深度神经网络的应用显著优化了这些功能的实现效果,相比经典算法,其能够解析更为复杂的语言结构,展现出更优的识别精度与更强的适应性。通过分层特征学习机制,这类模型可深入捕捉语言数据中隐含的语义关联。 语音转文本处理模块承担将音频信号转化为结构化文本的关键任务。该技术的持续演进大幅提高了人机语音交互的自然度与流畅性,使语音界面日益成为高效便捷的沟通渠道。 动态对话流程控制系统负责维持交互过程的连贯性与逻辑性,包括话轮转换、上下文关联维护以及基于情境的决策生成。该系统需具备处理各类非常规输入的能力,例如用户使用非规范表达或对系统指引产生歧义的情况。 本系统适用于多种实际应用场景,如客户服务支持、个性化事务协助及智能教学辅导等。通过准确识别用户需求并提供对应信息或操作响应,系统能够创造连贯顺畅的交互体验。借助深度学习的自适应特性,系统还可持续优化语言模式理解能力,逐步完善对新兴表达方式与用户偏好的适应机制。 在技术实施方面,RASA框架为系统开发提供了基础支撑。该框架专为构建对话式人工智能应用而设计,支持多语言环境并拥有活跃的技术社区。利用其内置工具集,开发者可高效实现复杂的对话逻辑设计与部署流程。 配套资料可能包含补充学习文档、实例分析报告或实践指导手册,有助于使用者深入掌握系统原理与应用方法。技术文档则详细说明了系统的安装步骤、参数配置及操作流程,确保用户能够顺利完成系统集成工作。项目主体代码及说明文件均存放于指定目录中,构成完整的解决方案体系。 总体而言,本项目整合了自然语言理解、语音信号处理与深度学习技术,致力于打造能够进行复杂对话管理、精准需求解析与高效信息提取的智能语音交互平台。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值