0%

混合编程

混合编程

什么是混合编程啊。就是不止一种语言的编程。额,这不等于废话。常见就是c调用c++,c++调用c。这就是最常见的混合编程,这是因为面向对象和面向过程都各有千秋,而且cpp的变量类型要求更大,所以更可靠点,c的话,小巧高效但是限制太少了,很容易越界,数据类型错误等。主要还是c使用面向过程的方法的话,是非常利于维护的

C调用CPP
1
2
3
4
5
6
7
8
9
10
11
12
//c调用cpp是不能直接使用cpp的类的,也不能直接使用cpp的函数,必须使用extern "C"{} //Cpp的头文件
class testCLASS
{
public:
static void funTest(void);
}
void outFun(void)
{
testCLASS::funTest();
}

extern "C" void outFun();
1
2
3
4
5
6
#include "testFUN.h" 

testCLASS::static void funTest(void) //Cpp文件
{
std::cout<<"OK"<<std::endl;
}
1
2
3
4
5
6
#include "testFUN.h" 	//Cpp的头文件

int main()
{
outFun();
}

这样就是一个最简单最简单的使用了,一般都是c来调用cpp,cpp很多情况都是可以直接调用c,只有部分,因为关键字
和数据结构体的问题等才会出现奇奇怪怪的bug。

C/CPP 调用Python

想不到吧,还能调用python呢,这个跟python版本有点关系,在python 3.12的官方手册中,有一个c扩展的功能,也就是通过调用Python.h来实现,对python函数的使用,那为什么可以实现这种情况呢。Python 本身就是一个C库。你所看到的可执行体python只不过是个stub。真正的python实体在动态链接库里实现,在Windows平台上,这个文件位于 %SystemRoot%\System32\python27.dll。

1
2
3
4
5
6
7
8
9
10
#include <Python.h>

int main(int argc, char *argv[])
{
Py_SetProgramName(argv[0]);
Py_Initialize();
PyRun_SimpleString("print 'Hello Python!'\n");
Py_Finalize();
return 0;
}

不过编译方法不是直接编译运行

1
2
3
4
5
#可以选择是devC++或者vs那种有命令行的ide
cl my_python.c -IC:\Python27\include C:\Python27\libs\python27.lib
#linux的话就是gcc操作
gcc my_python.c -o my_python -I/usr/include/python2.7/ -lpython2.7
#还可以使用Cython的方法,这个自行搜索吧

然后直接使用可执行文件即可

其实c和cpp调用python其实是多此一举的,性能又低,又不是我自己实现不了,cpp也是高级语言啊,cpp也有很多生态。
而且还有万能的指针,python就是看着舒服,简洁高效,模块化,效率和大小令人堪忧

Python调用C/CPP

直接使用Python的API,可以称之为最终解决方案。Cython, SWIG, SIP的接口文件转换后所生成的C/C++代码实际上都使用Python的API。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 定义参数类型与函数名称
import ctypes
from ctypes.wintypes import UINT, DWORD

GetLastInputInfo = ctypes.windll.user32.GetLastInputInfo


class LASTINPUTINFO(ctypes.Structure):
_fields_ = [("cbSize", UINT), ("dwTime", DWORD)]


# 开始调用DLL导出的函数
def getLastInputTime_nt():
info = LASTINPUTINFO()
info.cbSize = ctypes.sizeof(info)
info.dwTime = 0
if not GetLastInputInfo(ctypes.byref(info)):
raise WindowsError("")
return info.dwTime

print(getLastInputTime_nt())

效率提升二十倍:Python和C的混合编程_python和c混合编程-CSDN博客

上面这个博客,是把cpp编译成dll和lib文件,然后让python来直接调用,这也算吧,说白,这就是库的思想,你就说是不是混合编程嘛。
而且它有关于c的语言的特殊的数据类型库,python本身是没有数据类型的,只有容器哦

1
import ctypes

rust调用c
c调用rust
结语

要说用的多,还是python调用cpp写好的库,这个多实在啊,方便简单。还有就是c调用cpp间接封装好的类接口。混合编程其实就是为了利用各种语言之间的便捷性来实现互通互补,你说c语言可以不可以搞定一切,那肯定可以啊,那时间呢?效率呢?难易程度呢?这些都是我们想要考虑的情况,尤其是python,它有非常庞大的生态,很多库python都是有的,难道c要一个一个写?还是直接使用python来实现混合编程?答案就一目了然了

-------------下次的来访是什么时候呢[doge]-------------