Как косвенно вызвать функцию C

0

Предположим, что у меня есть следующая функция:

int func(int a, char* b, float c)
{
     return 42;
} 

Я - любопытство, если есть возможность вызвать эту функцию без:

  • явно вызывающий его (func(1, "abc", 2.4))
  • создавая для него указатель на функцию, а затем вызывая его через указатель функции.

Функция написана на C (или C++) и может быть расположена либо в библиотеке (DLL в Windows), либо где-то скомпилирована в текущем приложении. А теперь давайте предположим, что нет проблем с изменением имени.

Однако я знаю следующее:

  • имя функции.
  • количество и тип параметров в виде текстового ввода (например, " int ", " char* ", " float ").
  • его тип возврата

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

Я бы предпочел решение C, и я бы хотел избежать boost::bind...

Изменить - некоторые пояснения...

Тот, кто "вызывает" "функцию", представляет собой скомпилированную библиотеку сценариев (DLL). Он загружает язык сценариев (исходный файл), который имеет "привязки" к экстернальным "функциям" (те, которые я пытаюсь вызвать), а когда на языке сценариев он встречает "вызов этой внешней функции", он пытается вызвать эту внешнюю функцию, которая может быть в DLL... или в приложении, которое фактически загрузило DLL скриптового языка...

  • 1
    Это единственные опции в стандартном переносимом языке C. Однако для доступа к функциям в библиотеках будут применяться подходы, специфичные для платформы (например, dlsym POSIX).
  • 0
    Важна ли в вашем случае переносимость на другие архитектуры, кроме x86 и AMD64?
Показать ещё 4 комментария
Теги:
scripting

1 ответ

0

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

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

Это все еще бета-версия, однако я использую ее какое-то время, не сталкиваясь с какими-либо проблемами.

  • 0
    Это выглядит интересно, я посмотрю на него, чтобы увидеть, может ли он служить этой цели :)
  • 0
    Это может быть чертовски точно - я делал что-то похожее с этим раньше. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню