Разница между "% include" и "#include" - PullRequest
14 голосов
/ 09 июня 2011

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

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

%module my_module

%{
#include "MyHeader.h"
%}

%include "MyHeader.h"

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

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

Ответы [ 2 ]

18 голосов
/ 09 июня 2011

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

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

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

[update]

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

2 голосов
/ 09 июня 2011

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

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

Более подробно вы можете прочитать это: http://www.swig.org/Doc1.3/Preprocessor.html.

...