Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 3 из 3
  1. #1
    Аватар для Bady
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2013
    Сообщений
    170
    Репутация:
    3 ±

    Компилятор

    Поставил пофикшеный компилятор от 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

  2. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Режим совместимости. В компиляторе была защита от повторного подключения инклудов, т.е. если 2 раза подключить один и тот же инклуд, константы, переменные и функции из этого инклуда не будут объявлены повторно - второе, третье и т.д. подключения одного и того же файла будут игнорироваться.
    Zeex убрал эту фичу (т.к. она правильно работала только в Windows), чтобы компилятор работал одинаково как в Windows, так и в Linux и OS X.

    Сделать защиту от повторного подключения можно и самостоятельно:
    PHP код:
    #if defined MY_INCLUDEE_INC
        #endinput
    #endif

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

  3. Пользователь сказал cпасибо:
    Bady (04.09.2015)
  4. #3
    Аватар для Bady
    Пользователь

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

    Сделать защиту от повторного подключения можно и самостоятельно:
    PHP код:
    #if defined MY_INCLUDEE_INC
        #endinput
    #endif

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

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •