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

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

9
задан Gilles 'SO- stop being evil' 25 September 2012 в 09:08
поделиться

5 ответов

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

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

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

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

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

8
ответ дан 4 December 2019 в 14:28
поделиться
- 4859783-

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

Самое близкое было бы через динамическую загрузку библиотеки (DLL), таких как с DLSIM и на Linux. В противном случае он не доступен прямо в C .

1
ответ дан 4 December 2019 в 14:28
поделиться

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

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

1
ответ дан 4 December 2019 в 14:28
поделиться

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

1
ответ дан 4 December 2019 в 14:28
поделиться

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

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

3
ответ дан 4 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: