Перейти к содержимому


Фотография

Вопрос по #include


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 7

#1 8rutu5

8rutu5

    Пользователь

  • Пользователь
  • PipPipPip
  • 397 сообщений

Отправлено 31 Июль 2021 - 22:44

Подскажите, пожалуйста, возможно ли как-то использовать возможности одного плагина в другом без использования Native, Forward и т.д.?

Я знаю, что можно использовать #include "вспомогательный плагин_1.sp"

Но вся проблема в том, что, когда в основном плагине мы инклудим #include "вспомогательный плагин_1.sp", в котором в свою очередь инклудится #include "вспомогательный плагин_2.sp" и при этом, если #include "вспомогательный плагин_2.sp" есть и в основном плагине, то компилятор не сможет скомпилировать плагин. Как в этой ситуации поступить? Спасибо!



#2 Goldfish

Goldfish

    Пользователь

  • Пользователь
  • PipPipPip
  • 388 сообщений

Отправлено 02 Август 2021 - 18:44

Подскажите, пожалуйста, возможно ли как-то использовать возможности одного плагина в другом без использования Native, Forward и т.д.?

Я знаю, что можно использовать #include "вспомогательный плагин_1.sp"

Но вся проблема в том, что, когда в основном плагине мы инклудим #include "вспомогательный плагин_1.sp", в котором в свою очередь инклудится #include "вспомогательный плагин_2.sp" и при этом, если #include "вспомогательный плагин_2.sp" есть и в основном плагине, то компилятор не сможет скомпилировать плагин. Как в этой ситуации поступить? Спасибо!

 

инклуды нужно писать правильно, если это нормальный инклуд то достаточно прописать его корневой файл, дальше он подтянет из себя необходимые функции, так же как мы инклудим #include <sourcemod> подтягиваются базовые необходимые данные для работы плагина, если тебе нужно использовать отдельные функции из инклуда, его нужно правильно переписать чтобы он был независим от других



#3 8rutu5

8rutu5

    Пользователь

  • Пользователь
  • PipPipPip
  • 397 сообщений

Отправлено 02 Август 2021 - 18:52

инклуды нужно писать правильно, если это нормальный инклуд то достаточно прописать его корневой файл, дальше он подтянет из себя необходимые функции, так же как мы инклудим #include <sourcemod> подтягиваются базовые необходимые данные для работы плагина, если тебе нужно использовать отдельные функции из инклуда, его нужно правильно переписать чтобы он был независим от других

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

Например:

Инклуд 1 использует: 2 и 3

Инклуд 2 использует: 1 и 3

Инклуд 3 использует: 1

 

А главный плагин использует все инклуды. И по сути из-за этого кольца невозможна компиляция.

 

Сделать все в одном инклуде - не вариант. Так как объем кода огромный и ради этого все и затевалось, чтобы это все разделить и сделать читабельнее код.



#4 dr_lex

dr_lex

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 1 053 сообщений

Отправлено 03 Август 2021 - 1:08

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

Например:

Инклуд 1 использует: 2 и 3

Инклуд 2 использует: 1 и 3

Инклуд 3 использует: 1

 

А главный плагин использует все инклуды. И по сути из-за этого кольца невозможна компиляция.

 

Сделать все в одном инклуде - не вариант. Так как объем кода огромный и ради этого все и затевалось, чтобы это все разделить и сделать читабельнее код.

Библиотеки вообще нормально держать в формате .inc (так как .sp используются компилятором) и в папке include/test.inc

И просто добавить в начале кода как подключение библиотеки.

#include "test"

Если хочешь держать в не стандартной папке библиотеки то делаешь так
Например в папке help/test.inc
То надо писать так:

#include "help/test.inc"

 


 


Сообщение отредактировал dr_lex: 03 Август 2021 - 1:11


#5 8rutu5

8rutu5

    Пользователь

  • Пользователь
  • PipPipPip
  • 397 сообщений

Отправлено 03 Август 2021 - 2:00

Библиотеки вообще нормально держать в формате .inc (так как .sp используются компилятором) и в папке include/test.inc

И просто добавить в начале кода как подключение библиотеки.

#include "test"

Если хочешь держать в не стандартной папке библиотеки то делаешь так
Например в папке help/test.inc
То надо писать так:

#include "help/test.inc"

 

Спасибо, попробую. Я знаю, так-то, что в inc делают обычно, но, поначалу думал, что разницы никакой не будет



#6 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 05 Август 2021 - 3:27

Инклуд 1 использует: 2 и 3

Инклуд 2 использует: 1 и 3

Инклуд 3 использует: 1

"Инклуд 1" не может использовать "Инклуд 3", так как они взаимозависимы.

 

Подскажите, пожалуйста, возможно ли как-то использовать возможности одного плагина в другом без использования NativeForward и т.д.?

Использовать функционал одного плагина из другого без API можно, но очень больно. Тут в дело вступает некое подобие рефлексии в Sourcemod.
В Sourcemod есть возможность вызывать функции по их указателю. Получить указатель можно по имени функции (https://sourcemod.de...tFunctionByName). На сколько я понял из документации, функция должна быть public. Но для вызова потребуется уже указатель на плагин, если искомая функция не является частью текущего плагина. Указатель на плагин может выковырять из итератора плагинов (функции GetPluginIterator + MorePlugins + ReadPlugin) с проверкой на наличие функции через GetFunctionByName (вернёт INVALID_FUNCTION если такой функции нет в плагине) или напрямую через имя плагина в файловой системе (функция FindPluginByFile. Имя вместе с ".smx"). 
А дальше вызов функции через Call_StartFunction. Пример в спойлере, подробности по ссылке https://wiki.alliedm...eMod_Scripting)

Скрытый текст

Но мой тебе совет. Не поленись и напиши себе нормальное forward-native API, а к нему .inc библиотеку для других плагинов. Спасет и нервы и время.


Сообщение отредактировал PawnLomaster: 05 Август 2021 - 6:16

  • 8rutu5 это нравится

#7 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 05 Август 2021 - 6:37

Но вся проблема в том, что, когда в основном плагине мы инклудим #include "вспомогательный плагин_1.sp", в котором в свою очередь инклудится #include "вспомогательный плагин_2.sp" и при этом, если #include "вспомогательный плагин_2.sp" есть и в основном плагине, то компилятор не сможет скомпилировать плагин.

Ах да. Основной вопрос. Говоря совсем просто, то инклуды инклудов учитываются при компиляции. Подобное можно увидеть с самым главным инклудом <sourcemod>. Включая его в основной файл (который .sp), будут включены также и все инклуды в sourcemod.inc (если заглянуть в этот файл, их там достаточно много).
То есть при включении "вспомогательный плагин_1.sp", включается и "вспомогательный плагин_2.sp", и "вспомогательный плагин_2.sp" не надо подключать повторно.

 

А исходя из этого

Инклуд 1 использует: 2 и 3

Инклуд 2 использует: 1 и 3

Инклуд 3 использует: 1

Достаточно раскидать правильно логику, так как кольцо (без использования директив препроцессора, например #if defined) никогда не скомпилируется. Да и любопытно, как так вообще вышло.
Кстати, директивы препроцессора, скорее всего, будут самым простым способом избежать кольца и, в конце концов, скомпилировать плагин


Сообщение отредактировал PawnLomaster: 05 Август 2021 - 6:52


#8 8rutu5

8rutu5

    Пользователь

  • Пользователь
  • PipPipPip
  • 397 сообщений

Отправлено 05 Август 2021 - 19:43

Ах да. Основной вопрос. Говоря совсем просто, то инклуды инклудов учитываются при компиляции. Подобное можно увидеть с самым главным инклудом <sourcemod>. Включая его в основной файл (который .sp), будут включены также и все инклуды в sourcemod.inc (если заглянуть в этот файл, их там достаточно много).
То есть при включении "вспомогательный плагин_1.sp", включается и "вспомогательный плагин_2.sp", и "вспомогательный плагин_2.sp" не надо подключать повторно.

 

Вот эту часть я уже понял на себе. Вторую часть особо не знал, но погуглив немного разобрался. Оказывается мало написать
 

#if defined название_инклуда_included
#endinput
#endif

Надо написать еще:

#define название_инклуда_included

Иначе без второй части, то есть #define - тупо ничего не работает. Ни ошибок, ничего. Просто нет компиляции и все.

После этого заработало даже с кольцевой адресацией инклудов и проблем никаких нет.

Спасибо!




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных