Как можно добиться позднего связывания на языке Си? - PullRequest
9 голосов
/ 18 января 2010

Как можно добиться позднего связывания на языке Си?

Ответы [ 6 ]

8 голосов
/ 18 января 2010

Позднее связывание на самом деле не является функцией самого языка Си, а скорее тем, что обеспечивает ваша среда выполнения.

Многие системы будут предоставлять отложенное связывание в качестве функции компоновщика / загрузчика, и вы также можете использовать явные вызовы, такие как dlopen (для открытия общей библиотеки) и dlsym (для получения адреса символа в этом библиотека, чтобы вы могли получить к ней доступ или позвонить).

Единственным полупереносимым способом позднего связывания со стандартом C было бы использование некоторой хитрости с system(), и даже это хотя бы частично зависит от реализации.

Если вы не столько говорите об отложенном связывании, сколько о полиморфизме, вы можете добиться этого с помощью указателей на функции. По сути, вы создаете struct, в котором есть все данные для типа вместе с указателями на функции для поиска методов для этого типа. Затем в "конструкторе" (обычно это init () функция) вы устанавливаете указатели функций на соответствующие функции для этого типа.

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

3 голосов
/ 18 января 2010

Привязка символов в C всегда выполняется во время компиляции, а не во время выполнения.

Привязка библиотеки или динамическое связывание, как она вызывается, выполняется через dlopen() и dlsym() в * nix и LoadLibrary() и GetProcAddress() в Windows.

1 голос
/ 18 января 2010

К сожалению, вы не указали ОС. Для Unix вы можете использовать разделяемые библиотеки или создать настраиваемую (подключаемую) структуру модуля. Для получения дополнительной информации вы можете найти исходный код веб-сервера Apache 1.3 полезным. http://httpd.apache.org/download.cgi

1 голос
/ 18 января 2010

Используйте Objective-C или Lua.Оба являются языками с поздней привязкой, которые могут легко взаимодействовать с C.

Конечно, вы можете реализовать свою собственную схему разрешения имен, но зачем изобретать колесо?

1 голос
/ 18 января 2010

Как можно добиться позднего связывания на языке Си?

Наиболее близким будет динамическая загрузка библиотеки (DLL), например, с dlopen & dlsym в Linux. В противном случае он не доступен напрямую в C.

0 голосов
/ 13 апреля 2013

cppdev, кажется, единственный, кто попал в точку со своим замечанием. Пожалуйста, посмотрите на само определение . В двух словах:

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

Все остальные ответы просто упускают главное, то есть «ищите по имени».

Необходимое решение было бы очень похоже на таблицу поиска указателей на функции вместе с функцией или двумя для выбора правильного по имени (или даже по подписи). Мы называем это «хэш-таблица».

...