Как можно достигнуть позднего связывания на языке C?
Поздняя привязка на самом деле не является функцией самого языка Си, а скорее тем, что предоставляет вам ваша среда исполнения.
Многие системы предоставляют отложенную привязку в качестве функции компоновщика/загрузчика, а также вы можете использовать явные вызовы, такие как dlopen
(для открытия общей библиотеки) и dlsym
(для получения адреса символа внутри этой библиотеки, чтобы вы могли получить к нему доступ или вызвать его).
Единственным полупортативным способом получения поздней привязки со стандартом Си было бы использование некоторой хитрости с system()
и даже это, по крайней мере, частично зависит от реализации.
Если речь идет не столько об отложенном связывании, сколько о полиморфизме, то этого эффекта можно добиться с помощью указателей на функции. В принципе, вы создаете структуру
, которая содержит все данные для типа вместе с указателями функции для нахождения методов для этого типа. Затем, в "конструкторе" (обычно это функция init()), вы устанавливаете указатели функции на соответствующие функции для данного типа.
Все равно нужно включить весь код, даже если вы его не используете, но так можно получить полиморфизм is.
Как можно добиться позднего привязки на языке C?
Самое близкое было бы через динамическую загрузку библиотеки (DLL), таких как с DLSIM и на Linux. В противном случае он не доступен прямо в C
.
Используйте Objective-C или Lua. Оба являются позднеменными языками, которые могут легко взаимодействовать с C.
, конечно, вы могли бы реализовать свою схему разрешения имени, но зачем заново изобретать колесо?
К сожалению, вы не указывали ОС. Для UNIX вы можете использовать общие библиотеки или создать конфигурируемый (плагин) модуль структуры. Для получения дополнительной информации вы можете найти исходный код Apache 1.3 веб-сервера полезного. http://httpd.apache.org/download.cgi
Символьная привязка в C всегда выполняется во время компиляции, никогда во время выполнения.
Привязка библиотеки, или динамическая привязка, как она называется, осуществляется с помощью dlopen()
и dlsym()
на *nix, и LoadLibrary()
и GetProcAddress()
на Windows.