根据维基:
不同的编程语言使用不同的调用约定,不同的平台(CPU体系结构+操作系统)也是如此。这有时会在组合用多种语言编写的模块时造成问题。
那么,在用Python调用C/C++函数(从. So /..dll导出)时,我应该小心吗?如果是的话,我应该注意什么?
发布于 2012-02-07 02:59:43
从python调用C时,调用约定不是问题,因为python解释器本身是用C编写的,因此使用与C代码相同的调用约定。
当合并用不同编译语言编写的代码时(例如C和Ada ),就会出现问题。
通常C是系统编程语言,因此是标准的。这意味着任何语言的编译器通常都有与C进行互操作的特殊支持,参见这里获取C和Ada之间互操作性的示例。如果没有特殊的支持,则必须在程序集级别编写包装器。
如果需要从python调用C++/Ada,则必须遵循两个步骤。第一步是围绕C++/Ada函数编写C包装器。第二步是从python调用C包装器。
例如,下面的C++类。
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调用它了。(请注意,在现实生活中,有一些工具可以实现自动化,比如Boost.Python)。
注意,编写包装器有两个方面:调用约定之间的转换和类型表示之间的转换。后面的部分通常是最困难的,因为一旦您超越了基本类型,语言就会有非常不同的等价类型的表示形式。
发布于 2012-02-07 02:58:53
在Python和C之间调用是一个解决了的问题,所以您通常不需要担心任何事情--尤其是因为Python是用C编写的。
当一个平台上的多个语言都是独立开发的,独立地从汇编程序引导时,所描述的问题就更多了。例如,在C和FORTRAN之间以及C与Pascal之间调用时,当这三种语言都以粗等量的形式共存时,常常会出现一些著名的问题。旧的Mac主要是使用Pascal调用约定在汇编程序中编写的,早期的应用程序开发人员使用Borland。但是,像Symatec的THINK这样的C编译器出现了,那些程序员不得不特别担心如何翻译参数类型和字符串约定(Pascal字符串在开头带有一个长度字节,当然C字符串在末尾有一个0)。
发布于 2012-02-07 03:02:13
C和C++有不同的调用约定。C不支持调用C++函数,但C++支持调用C函数,并支持在C++中实现C函数。也就是说,您可以在extern "C"中将函数声明为C++。我不知道python绑定是如何调用C++的,但是您应该小心使用它们各自的调用约定调用C和C++函数。通常,在不同语言之间调用时使用C调用约定。这可能意味着您可能需要为C++样式函数使用C样式约定编写包装器函数。
https://stackoverflow.com/questions/9170393
复制相似问题