C/C++还能混合编程

什么是C/C++混合编程?

我们都知道C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)

对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制

那么什么是C/C++混合编程?实际上简单点说C/C++混合编程就是在同一个工程中,在C函数中调用C++函数或者在C++的函数中能够调用C函数的方法。

C/C++混合编程有什么用?

也许我们会有疑问,两者主要的功能都不一样,语法也不是完全相同,这不是没事找事吗?

实际在我们实际开发中,我们还是会用到的,比如C++语言支持函数重载,C语言不支持函数重载,那么在C工程中加入C++就有用处了。

另外,如果一个完整的工程是用C语言实现的,但是再进行增改功能或者移植的时候,另一个工程师只会C++怎么办?那么同样,为了提高工作效率,还是各司其职,提供接口即可。

怎么实现C/C++混合编程?

C++ 可以看作是C语言的扩展,它们调用的规则是相同的,但不同的编程语言都有自己的特性,混合使用时要处理全局命名约定、命令、参数传递、数据类型转换、出错处理,以及两种语言标准运行时的库的混合等等一系列的问题。

我们需要了解一下extern "C",我们在阅读程序时经常也会看到下面的代码

#ifdef __cplusplus
extern "C" {
#endif

void fun(void *, int);

#ifdef __cplusplus
}
#endif

__cplusplus是在C++中特有的,__cplusplus其实就是C++,extern "C"是由C++提供的一个连接交换指定符号,目的是告诉C++这段代码是C函数。请记住:extern "C"后面的函数不适用的C++的名字修饰,而是用C语言来修饰。

在C++中调用C

C 程序和 C++ 程序唯一的区别主要体现在函数名上: C语言使用的是简单的参数名,不考虑参数的个数和类型,而C++中的函数总会将它的参数类型列表当作函数名的一部分。因此C++程序提供一些特殊的功能可以直接表明调用C函数。

C函数实例如下:

/*helloworld.c*/
#include <stdio.h>
void sayhello(char *str)
{
    printf("hello world\n");
}

C++函数实例如下:

/*main.cpp*/
#include <iostream>
using namespace std;
extern "C" void sayhello(char *str);
int main(int argc, char *argv[]) 
{
    sayhello("hello from cpp to c\n");
    return 0;
}

在上述的代码中,C++程序中它的声明是extern "C", 那么如何编译文件呢?可以使用下面的命令:

g++ -c main.cpp -o main.o
gcc -c helloworld.c helloworld.o
gcc main.o helloworld.o -lstdc++ -o main

使用的是gcc所以最后的链接过程中要指定C++库,如果使用g++激活链接,那么就表示已经指定了C++的库。

extern "C"是指定编译和链接的规约,并不会影响语义。如果在头文件中声明函数,就要将整个头文件都声明为extern "C", 这是标准C++语法,展示如下:

extern "C" {
    int add(int a, int b);
    double div(double a, double b);
};

在C中调用C++

在 C 程序中调用C++程序时,C++程序提供的函数可以使用C语言的调用顺序。

在C++程序中创建C函数实例如下:

/*helloworld.cpp*/
#include <iostream>
using namespace std;
extern "C" void sayhello(char *str);
void sayhello(char *str)
{
    cout << str << endl;
}

C程序如下:

/*main.c*/
#include <stdio.h>
int main(int argc, char *argv[])
{
    sayhello("hello form C to C++");
    return 0;
}

编译使用的命令:

g++ -c hello.cpp -o hello.o
gcc -c main.c -o main.o
gcc hello.o main.o -lstdc++ -o main

在C++程序中函数sayhello()仍然是C++的代码,我们可以在函数中随意创建和清除对象。如果在函数sayhello()内部调用C函数,还必须表明调用的函数为extern "C",否则编译程序会认定它为C++函数,并且改变相应的函数名。

总结

C和C++对函数的处理方式是不同的,extern "C" 是使C++能够调用C的库文件的一个常用手段,在实际中还是经常用到的,如果要对编译器使用C的方式来处理函数的话,那么extern "C"就大有作为了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值