2012-07-09 5 views
4

SWIG가 다른 정의와 복잡한 함수를 기반으로 새 함수를 "정의"하는 간단한 전 처리기 매크로를 인식하도록하려고합니다. 그래서, C 헤더 파일에 내가 가진 :SWIG의 전 처리기 매크로

#define FOO 1 
#define my_macro_fun(args) my_fun(args,FOO) 

SWIG는보고 성공적으로 my_fun를 래핑,하지만 난 그것을 대신 my_macro_fun을 포장합니다.

답변

4

SWIG는 macros that are constants을 찾아서 감싸려고하지만 그와 같은 매크로로는 아무 것도 할 수 없습니다. 다행히도 쉽게 해결할 수 있습니다. 다음 헤더 파일이 상상 :

#define FOO 1 
#define my_macro_fun(args) my_fun(args,FOO) 

void my_fun(int a, int b); 

를 당신은 좋아하는 래핑 할 수 다음 my_macro_fun 기능을 생략

%module test 
%{ 
#include "test.h" 
%} 

%include "test.h" 

합니다. 사용 된 경우 정확히 같은 것, 그것은 my_macro_fun(int)가 호출 가정합니다 래퍼 코드를 생성 할 수 있습니다 -

%module test 
%{ 
#include "test.h" 
%} 

// Lie! Tell SWIG that it should be wrapped like any other function. 
void my_macro_fun(int); 

// This is entirely optional: it will cause my_fun to be wrapped as well 
%include "test.h" 

이 작은 거짓말 꿀꺽 꿀꺽 완벽하게 괜찮 : 당신이 할 필요가 비록 있음을 래핑하는 SWIG를 얻으려면 매크로. 래퍼를 컴파일 할 때 컴파일러는 매크로를 사용하여 끝낼 것이며 아무도 현명하지 못합니다.

인터페이스의 파일에서 %include 전에 실제로 매크로가 필요한 함수는 중요합니다. 그렇지 않으면 SWIG가 구문 오류가 발생하는 선언을 구문 분석하는 동안 매크로를 확장하려고 시도합니다. %include을 건너 뛰거나 %ignore을 사용하여 다른 부분에는 포함 시키지만 생성 된 인터페이스에서는 원래 my_fun을 억제 할 수 있습니다. 아무것도 그것을 주어지지 않은 경우

%module test 
%{ 
#include "test.h" 
%} 

%typemap(default) int b { 
    $1 = FOO; 
} 

%include "test.h" 

인수에 대한 값을 제공하려면 다음 몇 가지 꿀꺽 꿀꺽 언어 (예를 들어, 파이썬) 당신은 또한 use the typemap default 수와


.

관련 문제