Python实战社群php
Java实战社群ios
长按识别下方二维码,按需求添加c++
扫码关注添加客服程序员
进Python社群▲web
扫码关注添加客服算法
进Java社群▲编程
做者丨李肖遥
c#
ID丨技术让梦想更伟大缓存
什么是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"
,咱们在阅读程序时常常也会看到下面的代码
1#ifdef __cplusplus 2extern "C" { 3#endif 4 5void fun(void* ,int); 6 7#ifdef __cplusplus 8} 9#endif
__cplusplus
是在C++中特有的,__cplusplus
其实就是C++,extern "C"
是由C++提供的一个链接交换指定符号,目的是告诉C++这段代码是C函数。请记住:extern "C"
后面的函数不使用的C++的名字修饰,而是用C语言来修饰。
在C++中调用C
C 程序和 C++ 程序惟一的区别主要体如今函数名上:C语言使用的是简单的参数名,不考虑参数的个数和类型,而 C++ 中的函数总会将它的参数类型列表看成函数名的一部分。所以 C++ 程序提供一些特殊的功能能够直接声明调用 C 函数。
C函数实例以下:
1/*helloworld.c*/ 2#include <stdio.h> 3void sayhello(char *str) 4{ 5 printf(“hello world\n”); 6}
C++函数实例以下:
1/*main.cpp*/ 2#include <iostream> 3using namespace std; 4extern “C” void sayhello(char *str); 5int main(int argc,char *argv[]) 6{ 7 sayhello(“hello from cpp to c\n”); 8 return 0; 9}
在上述的代码中,C++ 程序中它的声明是 extern "C"
,那么如何编译文件呢?可使用下面的命令:
g++ -c main.cpp -o main.o
gcc -c helloworld.c -o helloworld.o
gcc main.o helloworld.o -lstdc++ -o main
使用的是 gcc 因此最后的连接过程当中要指定 C++ 库,若是使用 g++ 激活连接,那么就表示已经指定了 C++ 的库。
extern "C"
是指定编译和连接的规约, 并不会影响语义。若是在头文件中声明函数,就要将整个头文件都声明为extern "C"
,这是标准 C++ 语法,展现以下:
1extern “C”{ 2 int add(int a,int b); 3 double div(double a,double b); 4};
在C中调用C++
在 C 程序中调用 C++ 程序时,C++ 程序提供的函数可使用 C 语言的调用顺序。
在C++ 程序中建立 C 函数实例以下:
1/*helloworld.cpp*/ 2#include <iostream> 3using namespace std; 4extern “C” void sayhello(char *str); 5void sayhello(char *str) 6{ 7 cout<<str<<endl; 8}
C程序以下:
1/*main.c*/ 2#include <stdio.h> 3int main(int argc,char *argv[]) 4{ 5 Sayhello(“hello form C to C++”); 6 return 0; 7}
编译使用的命令:
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"
就大有做为了。
程序员专栏 扫码关注填加客服 长按识别下方二维码进群
近期精彩内容推荐:
在看点这里好文分享给更多人↓↓