2010-05-15 83 views

回答

2

PyUnicodeObjectPyObject一个子集所以不应该有它传递任何问题。

+0

...除了当然C编译器不可能知道(没有子集,子类,继承等的概念),所以你需要一个强制转换(指向指针强制转换的指针),正如我在我的答案中解释的那样。 – 2010-05-15 14:19:17

3

你可以只使用一个投在C代码用于此目的:

PyUnicodeObject *p = ...whatever...; 
callsomefun((PyObject*)p); 

所有的各种具体,具体类型PyWhateverObject可以被看作是的PyObject“源自”。现在C确实有继承的概念,所以它没有“派生”的概念,但是Python虚拟机非常简单地合成它,通过确保每个这样的对象的内存布局“开始于”一个头,这个头与一个PyObject结构是完全对应的有一个宏)。这保证了指针的正常C转换(虽然技术上“风险”,因为编译器无法检查正确性 - 如果你投错了东西,你只会在运行时崩溃;-)在指向PyObject的指针以及指向具体的具体Python类型结构的指针。

+0

联系我电话 PyUnicodeObject类型 - > PyBytesObject类型 PyUnicodeObject * p = ... whatever ...; callafun((PyByteObject *)p); 出现总线错误。 – dizgam 2010-05-15 14:21:05

+0

@kamol,'PyUnicodeObject'和'PyBytesObject'中的每一个都是'PyObject'的_separate_“概念子类”,所以演员阵容不会在那里工作(而且这不是**你在Q中提出的问题,所以我建议你编辑它以涵盖你的**真实**问题)。有关您当前非常具体且完全不同的问题,请参阅http://docs.python.org/py3k/c-api/unicode.html#PyUnicode_Encode(并确保为您创建的字节对象使用本地变量在调用完成之后,必须将其递减,除非你所调用的函数是一个很少见的函数,它可以引用_steals_)。 – 2010-05-15 14:41:15

相关问题