PDA

Просмотр полной версии : [Вопрос] Компилятор



Bady
04.09.2015, 00:32
Поставил пофикшеный компилятор от Zeex.
https://github.com/Zeex/pawn/releases/tag/20150531
Была ошибка при компилировании

fatal error 111: user error: Please include <a_npc> or <a_samp> first.
Почитал на форуме sa-mp.com что нужно поставить в pawn.cfg параметр -Z.
Хотелось узнать что он означает -Z

Daniel_Cortez
04.09.2015, 05:01
Режим совместимости. В компиляторе была защита от повторного подключения инклудов, т.е. если 2 раза подключить один и тот же инклуд, константы, переменные и функции из этого инклуда не будут объявлены повторно - второе, третье и т.д. подключения одного и того же файла будут игнорироваться.
Zeex убрал эту фичу (т.к. она правильно работала только в Windows), чтобы компилятор работал одинаково как в Windows, так и в Linux и OS X.

Сделать защиту от повторного подключения можно и самостоятельно:


#if defined MY_INCLUDEE_INC
#endinput
#endif

// <содержимое инклуда>

Здесь MY_INCLUDE_INC - название, образованное от имени файла "my_include.inc".
Директива #endinput заставляет компилятор не читать инклуд дальше, чтобы не допустить повторного включения содержимого инклуда.
Следует заметить, что эта директива доступна только в Pawn. В C/C++ защиту делают немного по-другому (в Pawn такой способ тоже доступен):


#if !defined MY_INCLUDE_INC

// <содержимое инклуда>

#endif // !defined MY_INCLUDE_INC

Комментарий после #endif служит напоминанием, к какому #if относится #endif на данной строке.
Естественно, лучше использовать 1-й вариант, чтобы потом не было проблем с поиском #endif в конфе файла.

Такая защита используется в стандартных инклудах Pawn (core.inc, float.inc, string.inc, etc.) и SA:MP (a_samp.inc, ...), но в других инклудах её может и не быть (streamer, sscanf2, тысячи их). Тут уже не обойтись без режима совместимости (-Z). Ещё, если разбираетесь в английском, то можно написать разработчикам инклудов/плагинов.
Либо можно самому впихивать защиту в инклуды, аки настоящий быдлокодер. А потом забыть о таком говнокодерском фиксе и при обновлении инклуда/плагина удивляться: "ой, а почему же у меня мод не компилируется?", и бежать плакаться на г-и. The end.

Bady
04.09.2015, 14:37
Режим совместимости. В компиляторе была защита от повторного подключения инклудов, т.е. если 2 раза подключить один и тот же инклуд, константы, переменные и функции из этого инклуда не будут объявлены повторно - второе, третье и т.д. подключения одного и того же файла будут игнорироваться.
Zeex убрал эту фичу (т.к. она правильно работала только в Windows), чтобы компилятор работал одинаково как в Windows, так и в Linux и OS X.

Сделать защиту от повторного подключения можно и самостоятельно:


#if defined MY_INCLUDEE_INC
#endinput
#endif

// <содержимое инклуда>

Здесь MY_INCLUDE_INC - название, образованное от имени файла "my_include.inc".
Директива #endinput заставляет компилятор не читать инклуд дальше, чтобы не допустить повторного включения содержимого инклуда.
Следует заметить, что эта директива доступна только в Pawn. В C/C++ защиту делают немного по-другому (в Pawn такой способ тоже доступен):


#if !defined MY_INCLUDE_INC

// <содержимое инклуда>

#endif // !defined MY_INCLUDE_INC

Комментарий после #endif служит напоминанием, к какому #if относится #endif на данной строке.
Естественно, лучше использовать 1-й вариант, чтобы потом не было проблем с поиском #endif в конфе файла.

Такая защита используется в стандартных инклудах Pawn (core.inc, float.inc, string.inc, etc.) и SA:MP (a_samp.inc, ...), но в других инклудах её может и не быть (streamer, sscanf2, тысячи их). Тут уже не обойтись без режима совместимости (-Z). Ещё, если разбираетесь в английском, то можно написать разработчикам инклудов/плагинов.
Либо можно самому впихивать защиту в инклуды, аки настоящий быдлокодер. А потом забыть о таком говнокодерском фиксе и при обновлении инклуда/плагина удивляться: "ой, а почему же у меня мод не компилируется?", и бежать плакаться на г-и. The end.
Спасибо, закройте тему