2012-11-28 2 views
1

SWIG를 사용하여 C에서 Python의 정적 함수에 어떻게 액세스합니까? 예 :Python에서 정적 C 함수에 액세스

static int foo(int a, int b); 

C 코드는 변경할 수 없습니다.

+1

나는 이것이 어떻게 작동하는지 혼란 스럽다. C에서 함수가 정적이라면 같은 C 프로그램의 다른 번역 단위에서 액세스 할 수 없다. 가능한 유일한 방법은 함수 정의가 어딘가에 헤더 파일에있는 경우입니다. – Flexo

답변

1

이 정말 수있는 유일한 방법은 하나

  1. 당신은 헤더 파일 내부의 선언과 정의가있는 경우
  2. 당신은 함수 포인터
  3. 일부 미친 미친 해커를 얻기의 방법이있다
  4. 당신은

는 # 1를 들어 내가 함께 예를 들어 난방을 넣어 사용할 수있는 전체 프로그램의 소스를 가지고 der 파일 :

#ifndef TEST_H 
#define TEST_H 

#include <stdio.h> 

static int foo(int a, int b) { 
    return printf("Frobination: %d-%d\n",a,b); 
} 

#endif 

헤더 파일 내부에서 그렇게하는 것이 이상하지만 불가능하지는 않습니다. 이 경우 우리는 정상으로 포장 할 수 있습니다

%module test 

%{ 
#include "test.h" 
%} 

%include "test.h" 

그리고로 실행 : 그것은 정적 함수의 로컬 버전이 바로 여기에 사용되는 물론 있다는 경고와 함께

Python 2.7.3 (default, Aug 1 2012, 05:16:07) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import test 
>>> test.foo(1,2) 
Frobination: 1-2 
17 
>>> 

여러 번역 단위 및 정적 함수가있는 경우에는 정상입니다.

#ifndef TEST_H 
#define TEST_H 

typedef int (*fptr)(int a, int b); 

extern fptr foo; 

#endif 

그리고로의 구현 :

%module test 

%{ 
#include "test.h" 
%} 

int foo(int a, int b); 

장소 :

#include "test.h" 
#include <stdio.h> 

static int foo_impl(int a, int b) { 
    return printf("Frobination: %d-%d\n",a,b); 
} 

fptr foo = foo_impl; 

어떤 우리가 다음으로 포장 할 수 있습니다 우리는 헤더 파일이있을 수 있습니다 # 2의

우리는 SWIG에게 거짓말을하고 foo가 함수 포인터가 아니라고 주장했지만 작동하고 완벽하게 합법적입니다. 왜냐하면 모든 ge 코드가 유효합니다.

# 3의 경우 이론적으로 다양한 플랫폼에 특정한 비 휴대용 트릭 클립이 정적 함수가 함수 포인터에있는 주소를 추출 할 수는 있지만 깨지기 쉽고 전반적으로 좋지 않습니다.

# 4의 경우 소스를 사용할 수 있으면 집이 무료입니다.

관련 문제