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.