Ошибки 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).
Итак, мой вопрос в том, каковы мои варианты здесь, учитывая, что я, вероятно, не хочу менять заголовки, поставляемые поставщиками?
Ответы
Ответ 1
SWIG не регрессирует по вложенным заголовкам по умолчанию, поэтому ваш файл .i
должен выглядеть примерно так:
%module mymod
%{
#include "foo.h"
%}
%include "top.h"
%include "foo.h"
Существует также переключатель SWIG:
-includeall - Follow all #include statements
но если у вас есть системные заголовки, которые могут делать больше, чем вы планируете.