xdsl писал(а):На x86 дефолтный тип вызова - "pascal".
дефолтный тип вызова это "register". (
документация)
Соглашение по вызову имеют смысл только для x86, платформы, для x86-64, арм-ов и других они просто игнорируются.
тип вызова "pascal" использовать не стоит, ибо он устаревший.
Самое безопасное это использовать вызов "cdecl", потому что очищение параметров лежит на коде, который делает вызов. (А это место вполне знает количество переданных параметров). Более того в Си, есть механизм произвольного
количества переданных параметров. (на самом деле это дополнительный скрытый параметр о количестве переданных параметров, + сами параметры)
Т.к. на платформах отличных от x86, параметры передаются не только через стэк, но и через регисты, произвльная передача параметров реализована сложнее. (и чуть больше походит на array of const)
FPC частично поддерживает "произвольное количество":
https://www.freepascal.org/docs-html/ref/refsu87.htmlно только для внешних функций. Т.е. объявить таким образом функцию самому не получится.
Можно попробовать сделать полухак: сделать объявление такой процедуры, а потом сделать её же реализацю в другом модуле, и указать есть имя на "экспорт". Тогда компоновщик сможет соединить два куска кода.
Ещё можно пойти более честным путём и использовать
libffi, для производства произвольных вызовов. (поддержка разных платформ и разных типов вызовов в наличии)
Но вообще меня немного удивляет сама задача:
Потому-что процедуру объявляет конечный пользователь моего проекта, а я ее только вызываю
а процедура как попадает в проект? через .dll (.so)?
потому что, если через dll, то вызов, как указано изначально - вполне уместен, главное соблюсти количество и тип параметров.
Полно библиотек, которые подгружаются в момент исполнения (тот же openGL)
если же процедура компилируется в проект, то вообще никаких проблем быть не должно.