Разница между «% include» и «#include»

13

В SWIG какая разница между директивой "% include" и стандартом C "#include"?

Например, во всех учебниках, почему они обычно выглядят примерно так:

%module my_module

%{
#include "MyHeader.h"
%}

%include "MyHeader.h"

Это кажется излишним для меня. Возможно, кто-то со знанием может прояснить.

Есть ли предпочтительный метод для включения кода на С++?

Теги:
swig

2 ответа

18
Лучший ответ

Материал в %{ ... %} передается непосредственно на выход; SWIG не интерпретируется сам по себе. Таким образом, #include должен убедиться, что сгенерированный код C/С++ включает этот заголовок.

%include, напротив, является директивой SWIG. Он сообщает SWIG обрабатывать этот файл заголовка перед продолжением. Таким образом, SWIG узнает (и сгенерирует обертку) типы и функции, объявленные в этом файле заголовка.

Если заголовок очень сложный, он может запутать SWIG или привести к очень большому результату (поскольку SWIG пытается создать оболочку для всего внутри). В таких случаях вам лучше вручную объявить только части заголовка, которые вам нужны SWIG для обработки, и опустить %include. Но вам все равно может понадобиться #include для сгенерированного сгенерированного С++.

[обновление]

Что касается "предпочтительного", SWIG - это больше о том, что работает, чем о том, что "предпочтительнее"... Если у вас есть очень чистый заголовочный файл, объявляющий хороший интерфейс для одного класса, вы можете просто %include его и иметь SWIG автоматически создает обертки. Если ваш заголовочный файл очень волосатый (например, iostream), вы должны вручную сообщить SWIG, что нужно обернуть. Но нет жесткого и быстрого правила.

2

% включает в себя каждый файл один раз, а это означает, что вам не нужны атрибуты include-guard. По умолчанию #include игнорируется, если вы не запускаете SWIG с опцией -includeall.

Кроме того, все, что между% {и%} игнорируется препроцессором и копируется без каких-либо изменений на выходе.

Наверху вы можете прочитать это: http://www.swig.org/Doc1.3/Preprocessor.html.

  • 0
    Уч. Что, если мне нужно, чтобы% включало один и тот же файл несколько раз (из-за того, что макрос препроцессора каждый раз устанавливал разные значения?)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню