SWIG: разница между% import и% include
SWIG docs объясняют эти две директивы следующим образом:
-
%include
: "Чтобы включить другой файл в интерфейс SWIG, используйте директиву %include
... В отличие от #include
, %include
включает каждый файл один раз (и не перезагружает файл на последующие объявления %include
). Поэтому нет необходимости использовать include-guards в интерфейсах SWIG."
-
%import
: "SWIG предоставляет другую директиву включения файлов с директивой %import
... Цель %import
заключается в сборе определенной информации из другого файла интерфейса SWIG или файла заголовка без фактического создания каких-либо (например, typedef), а также классы С++, которые могут использоваться в качестве базовых классов для деклараций классов в интерфейсе.
Мой вопрос в том, каковы различия между этими двумя директивами и каковы плюсы и минусы использования каждого из них?
P.S. Только для некоторой справочной информации. У меня есть простое расширение С++ - python, которое строит и работает, когда я использую любую из вышеперечисленных директив. Один, однако (%import
) дает меньше предупреждений, когда я вызываю swig -c++ -python my_file.i
.
Ответы
Ответ 1
Как работает SWIG, он предполагает, что любые допустимые объявления С++, которые вы предоставляете, должны быть доступны на целевом языке. Поэтому любой код С++, который предоставляется SWIG, будет использоваться для создания интерфейса.
%import
- механизм включения, который предотвращает создание интерфейса для кода, который он включает. Это различие. Поэтому вопрос, который вы задаете при включении заголовка, заключается в следующем: "Я хочу, чтобы все материалы в этом заголовке отображались на целевом языке?" Если ответ "нет", вы используете %import
.