Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不同的编程语言和调用约定_C++_Python_C_Calling Convention - Fatal编程技术网

C++ 不同的编程语言和调用约定

C++ 不同的编程语言和调用约定,c++,python,c,calling-convention,C++,Python,C,Calling Convention,根据维基: 不同的编程语言使用不同的调用约定,并且 不同的平台(CPU体系结构+操作系统)也是如此。这 在组合以中编写的模块时,有时可能会导致问题 多种语言 那么,在Python中调用C/C++函数(从.So/.dll导出)时,我应该小心吗? 如果是,我应该注意什么?在Python和C之间调用是一个已解决的问题,因此您通常不必担心任何事情,尤其是因为Python是用C编写的 当一个平台上的多种语言都是独立开发的,分别从汇编程序引导时,所描述的问题就更为严重了。例如,在C和FORTRAN之间,C和

根据维基:

不同的编程语言使用不同的调用约定,并且 不同的平台(CPU体系结构+操作系统)也是如此。这 在组合以中编写的模块时,有时可能会导致问题 多种语言

那么,在Python中调用C/C++函数(从.So/.dll导出)时,我应该小心吗?
如果是,我应该注意什么?

在Python和C之间调用是一个已解决的问题,因此您通常不必担心任何事情,尤其是因为Python是用C编写的


当一个平台上的多种语言都是独立开发的,分别从汇编程序引导时,所描述的问题就更为严重了。例如,在C和FORTRAN之间,C和Pascal之间,曾经有过著名的调用问题,当时这三种语言都以大致相同的方式共存。旧的Mac工具箱主要是在汇编程序中使用Pascal调用约定编写的,早期的应用程序开发人员使用Borland Pascal。但是后来出现了像Symatec的THINK C这样的C编译器,这些程序员不得不特别担心如何翻译参数类型和字符串约定(Pascal字符串在开头带有长度字节,当然C字符串在结尾带有0)

从python调用C时,调用约定不是问题,因为python解释器本身是用C编写的,因此使用与C代码相同的调用约定

当组合使用不同编译语言(例如C和Ada)编写的代码时,这会成为一个问题

通常C是系统编程语言,因此是标准。这意味着任何语言的编译器通常都具有与C交互操作的特殊支持。有关C和Ada之间的互操作性示例,请参阅。如果没有特殊的支持,则必须在程序集级别编写包装

如果需要从python调用C++/Ada,则必须遵循两个步骤。第一步是围绕C++/Ada函数编写一个C包装器。第二步是从python调用C包装器

例如,下面的C++类.< /P>

class Foo
{
public:
  Foo ();
  int bar ();
  ...
};
如果您想让python能够使用它,首先需要用C语言对其进行包装:

extern "C" {
typedef void *FooPtr;
FooPtr foo_new () { return (FooPtr)new Foo(); }
int foo_bar (FooPtr foo) { return ((Foo*)foo)->bar(); }
...
}
然后您可以从python调用它。(请注意,在现实生活中,有一些工具可以自动执行此操作,如)


请注意,编写包装有两个方面:在调用约定之间转换和在类型表示之间转换。后面的部分通常是最困难的,因为一旦你超越基本类型,语言就有了不同的等价类型的表示。

< P> C和C++有不同的调用约定。C不支持调用C++函数,而C++支持C函数的调用,支持C++中C函数的实现。也就是说,C++中可以声明函数为代码>外“C”< /代码>。我不知道Python绑定是如何调用C++的,但是你应该小心调用C和C++函数,并调用它们各自的调用约定。通常,在不同语言之间调用时使用C调用约定。这可能意味着您可能需要使用C++样式函数的C样式约定编写包装函数。

< P>调用约定是指如何在生成的程序集中生成函数调用。一种约定是调用方负责创建和清理局部变量的堆栈空间。另一个约定是被调用函数为局部变量创建和清理堆栈空间。使用哪一个并不重要,但显然它们必须匹配,否则堆栈将损坏


这里你可以看到更多的细节:

你用什么工具从Python调用C++函数?@ EthanSteinberg,cType。所以,如果我从艾达调用C,应该注意什么?怎么称呼?你指的是链接的名字,而不是调用约定。不,这不是我所指的!C和C++之间的函数调用约定可以不同。请参阅7.5(DCL。Link)以获取关于我所说的信息。是的,但这很混乱,而在C中封装C++调用的典型原因是因为名称的混乱,而不是因为调用约定。使用某些编译器,您可以声明函数的调用约定,它将编译为该约定。这通常用于与使用不同于标准C的调用约定编译的共享库的兼容性。我没有看到任何混淆:不同的名称被不同的调用约定所包含。然而,值得注意的是,即使与被破坏的系统完全匹配,如果调用函数不匹配函数调用的确切细节,也不会总是高兴的。在做了更多的研究之后,C和C++都使用相同的调用约定:CDECL。在C包装器中包装C++调用的原因是由于名称的限制,没有其他原因。见: