Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама



**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 100руб/мес, Текстовая 50руб/мес.
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 11
  1. #1
    Аватар для VVWVV
    Проверенный

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    548
    Репутация:
    250 ±

    Обход file guard с идентичными именами

    В данной статье я постараюсь объяснить обход защиты от повторного включения в исходный файл. Данная статья будет полезна тем, кто пишет, или собирается написать своей многофайловый проект.

    Введение

    Защита от повторного включения (или file guard, include guard) – защита, позволяющая избегать проблемы с повторным включением какой-либо библиотеки в исходный файл. Данный защитник работает следующем образом: генерирует константу, в названии которой содержится имя включаемого файла, и при последующем включении файла с таким же названием, защитник просто проигнорирует его. Важно отметить, что константа содержит только название файла, а не полный путь.

    Проблема и решение

    Проблема данного способа заключается в том, что названия файлов из разных директорий могут совпадать, хотя вероятность этого очень мала. Важно сказать, что на разных операционных системах это может работать по-разному.

    Например, в операционной системе Windows это работает так:
    PHP код:
    #include "some_dir_1\file"
    #include "some_dir_2\file" 
    В остальных же это может работать так:
    PHP код:
    #include "some_dir_1\\\\file"
    #include "some_dir_2\\\\file" 
    Хотя вряд ли кто-то из вас будет писать подобное.

    Будет загружен лишь один файл. Это происходит из-за обратного слэша, который присутствует в данном примере. Кроме того, первая конструкция повлечёт множество ошибок, например, на других операционных системах. Советую вам использовать обычный слэш для того, чтобы избежать ошибок.

    Давайте рассмотрим рабочий пример как для Windows, так и для других операционных систем.
    PHP код:
    #include "some_dir_1/file"
    #include "some_dir_2/file" 
    Оба файла будут загружаться во всех операционных системах одинаково.

    Немного советов

    • Для того чтобы избежать ошибок, необходимо использовать обычный слэш.
    • Использовать уникальные названия файлов. Кроме того, использовать теги перед этими названиями, дабы уменьшить вероятность совпадения.
    • Удалять генерируемую константу, используя препроцессорную директиву #undef.
    • В компиляторе от Zeex константа не генерируется, т.е. вышесказанной проблемы не появится. Однако, вы можете восстановить генерацию данной константы, используя флаг -Z.


    Автор: VVWVV
    Исключительно для pro-pawn.ru

    Копирование данной статьи на других ресурсах без разрешения автора запрещено!
    Последний раз редактировалось VVWVV; 11.12.2016 в 16:34.

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,353
    Репутация:
    1338 ±
    Собственно, в официальной документации к Pawn, в той части, где рассказывается про директиву #include, описан вариант с использованием "undef". Но будем честны, из всех скриптеров, что пишут скрипты для SA-MP, эту документацию открывало процентов 10. А знает о ней меньше половины.
    В общем, годно :з
    Связаться со мной можно в личных сообщениях этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. #3
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Онлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,556
    Репутация:
    2061 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    PHP код:
    #include <directory1\filename> // Загрузится только лишь этот.
    #include <directory2\filename>
    #include <directory3\filename> 
    Обратный слэш в именах файлов работает только под вендой. Вместо того, чтобы убивать совместимость с другими ОС и искать обходные пути, таким способом не следует пользоваться вообще.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  4. #4
    Аватар для VVWVV
    Проверенный

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    548
    Репутация:
    250 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Обратный слэш в именах файлов работает только под вендой. Вместо того, чтобы убивать совместимость с другими ОС и искать обходные пути, таким способом не следует пользоваться вообще.
    Что-то забыл, что в других системах это не работает. Забавно, если исправить это, то на разных осях это не должно работать одинаково, ведь, используя данный способ на Windows, у вас будет генерироваться совершено другое имя у константы.
    PHP код:
    _inc_a1/file 
    Что более приводит к несовместимости.

    Windows
    PHP код:
    #include "a1/f.inc" // Загрузится
    #include "a2/f.inc" // Загрузится 
    На других осях, например, Linux
    PHP код:
    #include "a1/f.inc" // Загрузится только этот.
    #include "a2/f.inc" 
    P.S. возможно, что-то упускаю.

    Следовательно, самым лучшем решением является компилятор от Zeex.
    Последний раз редактировалось VVWVV; 10.12.2016 в 02:51.

  5. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,353
    Репутация:
    1338 ±
    Самым лучшим решением являются уникальные имена для библиотек
    Связаться со мной можно в личных сообщениях этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. #6
    Аватар для VVWVV
    Проверенный

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    548
    Репутация:
    250 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Самым лучшим решением являются уникальные имена для библиотек
    Имя библиотек тоже могут совпасть, хотя, если правильно назвать, то вероятность этого уменьшится. Добавил твой вариант в список.

  7. #7
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,353
    Репутация:
    1338 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Имя библиотек тоже могут совпасть
    Ну так я для того и написал "уникальные" ведь :)
    Сам пишу свой проект разбив на файлы и никаких проблем с именами нет.
    Если всё продумывать заранее и не писать код от балды, контролировать имена не составит труда.

    Да и никто не запрещает в начале каждого инклуда прописывать
    PHP код:
    #undef _inc_<имя файла> 
    Связаться со мной можно в личных сообщениях этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. #8
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Онлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,556
    Репутация:
    2061 ±
    Ок, подведём итоги:

    • Как уже правильно заметил DeimoS, одинаковых идентификаторов в защите от повторного подключения возникнуть не должно, если у автора инклуда руки растут из нужного места. И лично я тоже считаю эту проблему с одинаковыми include guard надуманной.

    • То, что сейчас описывается в этой статье - контрпродуктивно. Вместо того, чтобы описывать сомнительные практики по обходу проблемы, следует предостеречь читателей от использования обратных слэшей в путях к файлам. Причину я уже объяснил в своём посте выше.


    Полагаю, вывод очевиден. В таком виде эта тема не может быть перемещена в раздел для одобренных статей.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  9. #9
    Аватар для VVWVV
    Проверенный

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    548
    Репутация:
    250 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Ок, подведём итоги:

    • Как уже правильно заметил DeimoS, одинаковых идентификаторов в защите от повторного подключения возникнуть не должно, если у автора инклуда руки растут из нужного места. И лично я тоже считаю эту проблему с одинаковыми include guard надуманной.

    • То, что сейчас описывается в этой статье - контрпродуктивно. Вместо того, чтобы описывать сомнительные практики по обходу проблемы, следует предостеречь читателей от использования обратных слэшей в путях к файлам. Причину я уже объяснил в своём посте выше.


    Полагаю, вывод очевиден. В таком виде эта тема не может быть перемещена в раздел для одобренных статей.
    UPD: Изменил пост.
    Последний раз редактировалось VVWVV; 11.12.2016 в 15:22.

  10. #10
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,353
    Репутация:
    1338 ±
    Мне уже прилетел в личку вопрос о поводу этой части :)
    Цитата Сообщение от VVWVV Посмотреть сообщение

    • В компиляторе от Zeex данная ошибка устранена. Для того чтобы вернуть данную фичу, вам необходимо использовать флаг -Z.
    Уточни, что "данная ошибка/фича" - это речь о генерации макроса
    PHP код:
    #define _inc_filename 
    Связаться со мной можно в личных сообщениях этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 
Страница 1 из 2 12 ПоследняяПоследняя

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

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

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

Ваши права

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