使用预处理器宏将原始值定义为使用 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 原始 floatdouble 宏的计算值?

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>