문제

Python 매뉴얼에 따르면 C와 C ++ 모두에서 Python 용 모듈을 만들 수 있다고합니다. C ++를 사용할 때 클래스 및 템플릿과 같은 것을 활용할 수 있습니까? 나머지 라이브러리와 통역사와 비 호환성을 만들지 않습니까?

도움이 되었습니까?

해결책

후크 기능 구현이 C 또는 C ++에서 구현되는지 여부는 중요하지 않습니다. 사실, 나는 이미 C ++ 템플릿과 부스트 라이브러리를 적극적으로 사용하는 일부 파이썬 확장을 보았습니다. 문제 없어요. :-)

다른 팁

Boost 사람들은 Python에서 사용할 C ++ 코드 포장을 수행하는 멋진 자동화 된 방법을 가지고 있습니다.

그것은 불러옵니다 : boost.python

그것은 SWIG보다 C ++의 일부 구성, 특히 템플릿 메타 프로 그램을 다룹니다.

당신이 관심있는 것은 프로그램입니다 통음. C ++ 코드의 파이썬 포장지와 인터페이스를 생성합니다. 템플릿, 상속, 네임 스페이스 등과 함께 사용하면 잘 작동합니다.

C ++ 언어의 모든 기능을 사용할 수 있어야합니다. 그만큼 파이썬 문서 확장 (2.6.2) C ++를 사용할 수 있지만 다음 경고를 언급합니다.

C ++로 확장 모듈을 작성할 수 있습니다. 일부 제한이 적용됩니다. 기본 프로그램 (Python 통역사)이 C 컴파일러에 의해 컴파일되고 연결된 경우 생성자와 함께 글로벌 또는 정적 객체를 사용할 수 없습니다. 메인 프로그램이 C ++ 컴파일러에 의해 연결된 경우에는 문제가되지 않습니다. Python 통역사 (특히 모듈 초기화 함수)에서 호출 할 함수는 Extern "C"를 사용하여 선언해야합니다. Python 헤더 파일을 Extern "C"{...}에 동봉하는 것은 불필요합니다. __cplusPlus 기호가 정의 된 경우 이미이 양식을 사용합니다 (모든 C ++ 컴파일러는이 기호를 정의합니다).

첫 번째 제한은 "생성자가있는 글로벌 또는 정적 객체를 사용할 수 없습니다"는 대부분의 C ++ 컴파일러 가이 유형의 저장 시간을 사용하여 개체를 초기화하는 방식과 관련이 있습니다. 예를 들어 다음 코드를 고려하십시오.

class Foo { Foo() { } };

static Foo f;

int main(int argc, char** argv) {}

컴파일러는 메인이 실행되기 전에 'foo'생성자가 'f'로 호출되도록 특수 코드를 방출해야합니다. 파이썬 확장에 정적 저장 시간이있는 객체가있는 경우 그리고 Python 통역사는 C ++에 대해 컴파일되지 않고 연결되어 있지 않으면이 특수 초기화 코드가 생성되지 않습니다.

두 번째 제한은 "Python 통역사 (특히, 모듈 초기화 함수)가 호출 할 함수는 Extern"C ""를 사용하여 선언해야하며 C ++ 이름 Mangling과 관련이 있어야합니다. 대부분의 C ++ 컴파일러는 이름을 관리하여 C Toolchains에 제공된 동일한 링커를 사용할 수 있습니다. 예를 들어 :

void a_function_python_calls(void* foo);

C ++ 컴파일러는 'a_function_python_calls'라는 이름을 'a_function_python_calls@1vga'와 같은 것으로 변환 할 수 있습니다. 이 경우 파이썬 라이브러리와 연결하려고 할 때 해결되지 않은 외부를 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top