2010-05-15 4 views

답변

2

PyUnicodeObjectPyObject의 일부가 그렇게 전달 문제가 안됩니다.

+0

... 물론 C 컴파일러는 그 대답을 설명 할 때 캐스트 (포인터 캐스트에 대한 포인터)가 필요하므로 어쩌면 (서브셋, 서브 클래스, 상속 등의 개념이 없다는 것을) 알 수 없습니다. –

3

당신은이 목적을 위해 C 코드에 캐스트를 사용할 수 있습니다

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

모든 다양한 특정, 콘크리트 종류 PyWhateverObject은의 PyObject "에서 파생 된"것으로 생각 될 수있다. 이제 C에는 상속 개념이 있으므로 "파생 된"것은 없지만 Python VM은 모든 객체의 메모리 레이아웃이 정확하게 PyObject 구조체에 해당하는 헤더로 시작되도록 보장함으로써 매우 간단하게 합성합니다 거기에 대한 매크로가 있습니다). 이것은 정상적인 C 포인터의 캐스팅을 보장합니다 (컴파일러가 정확성을 검사 할 수 없기 때문에 기술적으로 "위험"함). PyObject에 대한 포인터 사이에서 올바르게 사용될 때 의도 한대로 작동합니다. 구체적이고 구체적인 파이썬 타입 struct에 대한 포인터.

+0

전화 : PyUnicodeObject 유형 -> PyBytesObject 유형 PyUnicodeObject * p = ... 뭐든지 ...; callafun ((PyByteObject *) p); 버스 오류가 발생했습니다. – dizgam

+0

@kamol,'PyUnicodeObject'와'PyBytesObject'는 각각'PyObject'의 _separate_ "conceptual subclass"입니다. 그래서 캐스트가 작동하지 않을 것입니다. ** 진짜 ** 질문을 다루기 위해 그것을 편집하십시오.) 매우 구체적이고 완전히 다른 현재 질문에 대해서는 http://docs.python.org/py3k/c-api/unicode.html#PyUnicode_Encode를 참조하십시오. (따라서 생성 한 바이트 개체에 로컬 변수를 사용해야합니다. 당신이 부르는 것이 희귀 한 기능이 아니라면 전화가 끝난 후에 그것을 단정 지어야한다. –

관련 문제