В SWIG какая разница между директивой "% include" и стандартом C "#include"?
Например, во всех учебниках, почему они обычно выглядят примерно так:
%module my_module
%{
#include "MyHeader.h"
%}
%include "MyHeader.h"
Это кажется излишним для меня. Возможно, кто-то со знанием может прояснить.
Есть ли предпочтительный метод для включения кода на С++?
Материал в %{ ... %}
передается непосредственно на выход; SWIG не интерпретируется сам по себе. Таким образом, #include
должен убедиться, что сгенерированный код C/С++ включает этот заголовок.
%include
, напротив, является директивой SWIG. Он сообщает SWIG обрабатывать этот файл заголовка перед продолжением. Таким образом, SWIG узнает (и сгенерирует обертку) типы и функции, объявленные в этом файле заголовка.
Если заголовок очень сложный, он может запутать SWIG или привести к очень большому результату (поскольку SWIG пытается создать оболочку для всего внутри). В таких случаях вам лучше вручную объявить только части заголовка, которые вам нужны SWIG для обработки, и опустить %include
. Но вам все равно может понадобиться #include
для сгенерированного сгенерированного С++.
[обновление]
Что касается "предпочтительного", SWIG - это больше о том, что работает, чем о том, что "предпочтительнее"... Если у вас есть очень чистый заголовочный файл, объявляющий хороший интерфейс для одного класса, вы можете просто %include
его и иметь SWIG автоматически создает обертки. Если ваш заголовочный файл очень волосатый (например, iostream
), вы должны вручную сообщить SWIG, что нужно обернуть. Но нет жесткого и быстрого правила.
% включает в себя каждый файл один раз, а это означает, что вам не нужны атрибуты include-guard. По умолчанию #include игнорируется, если вы не запускаете SWIG с опцией -includeall.
Кроме того, все, что между% {и%} игнорируется препроцессором и копируется без каких-либо изменений на выходе.
Наверху вы можете прочитать это: http://www.swig.org/Doc1.3/Preprocessor.html.