вторник, 29 декабря 2015 г.

Perl изнутри: файл INTERN.h

Продолжаем изучать файлы исходников и на этот раз рассмотрим файл "INTERN.h". Вот его содержимое:

#undef EXT
#undef dEXT
#undef EXTCONST
#undef dEXTCONST

#  if (defined(WIN32) && defined(__MINGW32__)) || defined(__SYMBIAN32__)
#    ifdef __cplusplus
#      define EXT    __declspec(dllexport)
#      define dEXT
#      define EXTCONST    __declspec(dllexport) extern const
#      define dEXTCONST    const
#    else
#      define EXT    __declspec(dllexport)
#      define dEXT
#      define EXTCONST    __declspec(dllexport) const
#      define dEXTCONST    const
#    endif
#  else
#    ifdef __cplusplus
#      define EXT
#      define dEXT
#      define EXTCONST EXTERN_C const
#      define dEXTCONST const
#    else
#      define EXT
#      define dEXT
#      define EXTCONST const
#      define dEXTCONST const
#    endif
#  endif

#undef INIT
#define INIT(x) = x

#define DOINIT

Как можно увидеть структура файла почти полностью идентична файлу "EXTERN.h", и подробнее о принципе их работ можно прочитать в предыдущей статье. Мы же заострим внимание на ключевых различиях в объявляемых макросах. Их значения для каждого файла указаны в таблице (пример для linux):

INTERN.hEXTERN.h
DOINITне задан
dEXT
EXTCONSTconstextern const
dEXTCONSTconstconst
EXTextern
INIT(x)= x

Пояснение: пустые клетки обозначают, что макрос объявлен, но значения у него нет.

Особого внимания заслуживает макрос INIT(x), так как он отличается от остальных тем, что может принимать один параметр и производить следующий код:

с использованием "INTERN.h":
#include "INTERN.h"
int a INIT(8);           // int a = 8;

ну а с использованием "EXTERN.h" просто объявляется переменная, без инициализации:
#include "EXTERN.h"
int a INIT(8);           // int a;

Комментариев нет:

Отправить комментарий