使用预处理器宏将原始值定义为使用 SWIG 的函数参数
Using preprocessor macros to define primitive values as function arguments using SWIG
假设我的 C 代码中有以下宏:
#if __SOME_CONDITION__
#define SAMPLE_TYPE double
#elif
#define SAMPLE_TYPE float
#endif
基本上将 SAMPLE_TYPE
定义为两种可能的原始类型之一,具体取决于另一个编译器 directive/other 预处理器定义。
我使用 SWIG 包装的 class 有以下 header:
class SomethingStatic {
public:
static SAMPLE_TYPE someFunction();
}
当我构建和包装代码并从我的 Java 代码引用 SomethingStatic.someFunction
时,return 类型被指定为 SWIGTYPE_p_SAMPLE_TYPE
,它也是由SWIG.
如何将 SWIG 配置为 return 原始 float
或 double
宏的计算值?
SWIG 理解预处理器,但您必须 %include
header 直接定义。 SWIG 不会递归到 header 包含的其他 header。还要确保在调用 swig
和编译器时声明预处理器值。
示例:
condition.h
#ifdef CONDITION
#define SAMPLE_TYPE double
#else
#define SAMPLE_TYPE int
#endif
class.h
#include "condition.h"
class SomethingStatic {
public:
static SAMPLE_TYPE someFunction() {
#ifdef CONDITION
return 1.5;
#else
return 2;
#endif
}
};
test.i
%module test
// This code is directly included in the wrapper.
// C++ will process condition.h implicitly
%{
#include "class.h"
%}
// Headers that SWIG will create wrappers for.
// SWIG *does not* recurse into subheaders by default.
%include "condition.h" // must be explicit with SWIG
%include "class.h"
%}
使用“swig -python -c++ test.i”并在没有 /DCONDITION:
的情况下进行编译
>>> import test
>>> x=test.SomethingStatic()
>>> x.someFunction()
2
使用“swig -DCONDITION -python -c++ test.i”并使用 /DCONDITION:
进行编译
>>> import test
>>> x=test.SomethingStatic()
>>> x.someFunction()
1.5
Demo 如果你注释掉 %include "condition.h"
行,这似乎是 OP 的原始问题:
>>> import test
>>> x=test.SomethingStatic()
>>> x.someFunction()
<Swig Object of type 'SAMPLE_TYPE *' at 0x000001D369F9B4E0>
假设我的 C 代码中有以下宏:
#if __SOME_CONDITION__
#define SAMPLE_TYPE double
#elif
#define SAMPLE_TYPE float
#endif
基本上将 SAMPLE_TYPE
定义为两种可能的原始类型之一,具体取决于另一个编译器 directive/other 预处理器定义。
我使用 SWIG 包装的 class 有以下 header:
class SomethingStatic {
public:
static SAMPLE_TYPE someFunction();
}
当我构建和包装代码并从我的 Java 代码引用 SomethingStatic.someFunction
时,return 类型被指定为 SWIGTYPE_p_SAMPLE_TYPE
,它也是由SWIG.
如何将 SWIG 配置为 return 原始 float
或 double
宏的计算值?
SWIG 理解预处理器,但您必须 %include
header 直接定义。 SWIG 不会递归到 header 包含的其他 header。还要确保在调用 swig
和编译器时声明预处理器值。
示例:
condition.h
#ifdef CONDITION
#define SAMPLE_TYPE double
#else
#define SAMPLE_TYPE int
#endif
class.h
#include "condition.h"
class SomethingStatic {
public:
static SAMPLE_TYPE someFunction() {
#ifdef CONDITION
return 1.5;
#else
return 2;
#endif
}
};
test.i
%module test
// This code is directly included in the wrapper.
// C++ will process condition.h implicitly
%{
#include "class.h"
%}
// Headers that SWIG will create wrappers for.
// SWIG *does not* recurse into subheaders by default.
%include "condition.h" // must be explicit with SWIG
%include "class.h"
%}
使用“swig -python -c++ test.i”并在没有 /DCONDITION:
的情况下进行编译>>> import test
>>> x=test.SomethingStatic()
>>> x.someFunction()
2
使用“swig -DCONDITION -python -c++ test.i”并使用 /DCONDITION:
进行编译>>> import test
>>> x=test.SomethingStatic()
>>> x.someFunction()
1.5
Demo 如果你注释掉 %include "condition.h"
行,这似乎是 OP 的原始问题:
>>> import test
>>> x=test.SomethingStatic()
>>> x.someFunction()
<Swig Object of type 'SAMPLE_TYPE *' at 0x000001D369F9B4E0>