http://www.swig.org/papers/PyTutorial98/PyTutorial98.pdf 来自以上链接:
我知道这是一个旧的出版物,因此信息可能已经过时.
我想问一下:
"如果你不太聪明,似乎可以正常使用C++"这是什么意思,太聪明了?
在编写C++模块和使用swig工具扩展Python的地方,我是否已经非常谨慎地知道情况/案例?
这张幻灯片很奇怪并且具有误导性。SWIG 根本不会将按值传递转换为按引用传递。让我尝试通过一个例子来澄清:
假设如示例中所示,您有 C++ 函数
double dot_product(Vector a, Vector b);
Run Code Online (Sandbox Code Playgroud)
现在,在纯 C++ 中(无 SWIG、无包装),您可以使用此函数,如以下示例所示:
1.
Vector a = Vector(1,0);
Vector b = Vector(0,1);
double zero = dot_product(a, b);
Run Code Online (Sandbox Code Playgroud)
2.
Vector *a = new Vector(1,0);
Vector *b = new Vector(0,1);
double zero = dot_product(*a, *b);
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,实际上使用按值调用以完全相同的方式调用该函数。
SWIG 将所有对象包装到一个包含指向该对象的指针的结构中,因此 SWIG 在幕后为所有对象传递指针,因此使用第二个示例中的语法。但无论如何,调用语义都没有发生转换/变换。
回答您的问题:
“如果你不是太聪明的话,似乎可以很好地使用 C++” 太聪明是什么意思?
我不知道。正如另一个答案中所说,可能是一个笑话。
在编写 C++ 模块并使用 swig 工具扩展 Python 时,是否存在我应该非常小心的已知情况/情况?
这是一个非常广泛的问题,并且肯定存在陷阱,尤其是与内存管理相关的陷阱。然而,这种特殊的“转变”并不是问题。
作为参考,这里是SWIG 手册中的相关条目。请注意,它的措辞不同:该函数被转换为接受指针。没有提及“调用语义”(因为这不是问题)。