Подтвердить что ты не робот

Ошибки SWIG из-за директивы препроцессора

У нас есть поставщик, который предоставил нам С++-библиотеку и заголовки, которые я пытаюсь обернуть с помощью SWIG. Похоже, что они слишком умны наполовину с инструкциями препроцессора:

// top.h
#define DECLARE_WITH_COMMA(a) a,

а затем

// foo.h
#include "top.h"

#define MY_TYPES(d) \
  d(One)   \
  d(Two)   \
  d(Three) \
  NumElems

enum MyTypes {
  MY_TYPES(DECLARE_WITH_COMMA)
};

Что является долгожданным способом сказать, что когда я пытаюсь запустить SWIG (версия 2.0.4) на "foo.h", я получаю:

foo.h:12: Error: Syntax error in input(1).

Итак, мой вопрос в том, каковы мои варианты здесь, учитывая, что я, вероятно, не хочу менять заголовки, поставляемые поставщиками?

4b9b3361

Ответ 1

SWIG не регрессирует по вложенным заголовкам по умолчанию, поэтому ваш файл .i должен выглядеть примерно так:

%module mymod

%{
#include "foo.h"
%}

%include "top.h"
%include "foo.h"

Существует также переключатель SWIG:

-includeall     - Follow all #include statements

но если у вас есть системные заголовки, которые могут делать больше, чем вы планируете.