c++ - 如何阻止 SWIG 为类型宏抛出语法错误(c++ 到 python)

标签 c++ macros swig preprocessor

我对 SWIG(以及 C++)还很陌生,我正在尝试将名为 p_convolve.hpp 的东西从一个名为 evergreenforest 的库包装到 python(你可以在这里查看:https://bitbucket.org/orserang/evergreenforest/src/master/)。我不能走得太远,因为 SWIG 在使用库中其他地方定义的宏时会抛出语法错误。我使用的是 c++11、python 2.7 和最新版本的 swig。

我刚刚开始,还没有真正尝试按顺序包装和获取类型映射,只是想看看它是否能编译,但我遇到了语法错误。错误出现在使用我认为称为宏的行上,该宏在库实用程序的 FLOAT_TYPE.hpp 中定义。我将在下面发布该文件的代码,以及导致错误的行。我还没有尝试任何东西,因为我在 swig 文档中找不到“宏”或“定义”,也不知道该怎么做。我也在使用 numpy.i,我还没有深入到实际做任何事情的程度,但如果有任何解决方案也能很好地与它配合,我将不胜感激。

//The macro, or at least that's what I think it's called, which is          
//included  in the problem file
#ifndef _FLOAT_TYPE_HPP
#define _FLOAT_TYPE_HPP

  #ifdef FAST_FLOAT
    typedef float FLOAT_TYPE;
  #else
    #ifdef ACCURATE_FLOAT
      typedef long double FLOAT_TYPE;
    #else
      // standard
      typedef double FLOAT_TYPE;
    #endif
  #endif

 #endif

导致问题的行来自 p_convolve.hpp:

const FLOAT_TYPE tau_denom(1e-9L);

.i 文件,p_convolve.i:

%module p_convolve
%include "std_vector.i"

%{
#define SWIG_FILE_WITH_INIT
#include "p_convolve.hpp"
#include <array>
#include <set>
#include "naive_convolve.hpp"
#include "fft_convolve.hpp"
#include "../Utility/FLOAT_TYPE.hpp"
%}

%include "numpy.i"

%init %{
import_array();
%}

%include "p_convolve.hpp"

最后,为了彻底,我用什么编译:

swig -python -c++ p_convolve.i
g++ -fpic -c p_convolve_wrap.cxx -I/usr/include/python2.7 -I/home/sean/Desktop/SerangLab/Swig/numpy/numpy/core/include/ -I/home/sean/.local/lib/python2.7/site-packages/numpy/core/include/numpy/
g++ -shared p_convolve_wrap.o -o _p_convolve.so 

我期望或希望的结果是让这个东西能够编译成一个模块——在我得到类型映射等之前它不会是一个好的或有用的,但只是为了摆脱这些语法错误是当前的目标。提前致谢!

最佳答案

SWIG 不会递归到包含在由 %include 引用的顶级文件中的包含文件中, 所以你需要特别 %include您需要从中定义的其他文件。这是故意的...您通常不想为 <stdio.h> 中的所有内容生成接口(interface)或 <iostream>只是因为它们在您的包含文件中使用。

所以你可能至少需要:

%include "float_type.hpp"
%include "p_convolve.hpp"

如果您不想在 SWIG 界面中包含 float_type.hpp 中的所有内容,您至少可以提供您确实需要的定义:

typedef double FLOAT_TYPE;
%include "p_convolve.hpp"

关于c++ - 如何阻止 SWIG 为类型宏抛出语法错误(c++ 到 python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56799489/

相关文章:

python - 在无法访问库源的情况下将 swig c++ 用于 python

c++ - 使用 "const"关键字为 c++ 突出显示 emacs 语法

C++ 建议如何打破 while 循环

c++ - 我不明白 ptr_fun

visual-studio - 为 Visual Studio 2010 自定义宏分配键盘快捷键

c - 宏——函数与乘法的结合

vba 宏 - 有时有效,有时无效

c++ - glm::quatLookAt返回一个NaN四元数

python - swig 将元组列表传递给 C++ 函数

Python-在dict中用作 "dummy value"的最便宜的数据类型是什么