2013-05-07 4 views
1

У меня возникли первые опасения по поводу публикации этого вопроса, чтобы он не дублировал. Но даже после поиска по ключевым словам, я не смог найти ссылку на StackOverflow, которая объясняет статическое и динамическое связывание для C. Есть вопросы и ответы для C++, хотя , но все они включают classes и вещи, которые явно не для C. И ссылки за пределами StackExchange были довольно сомнительными.Что такое статическое и динамическое связывание в C (строго C, а не C++)?

Мне нужно знать строгое определение и контраст между этими двумя связями, исключительно в контексте CI, было бы признательно, если вы можете занять некоторое время, чтобы ответить на него, или дать мне ссылки на StackOverflow для этого, чтобы я не ошибся и на это был дан ответ подробно.

Я намерен иметь четкое представление о:

  1. Связывание в С.
  2. Статическая против динамическое связывание в С.

Редактировать Было бы очень полезно, если бы вы могли объясните разницу с некоторыми простыми фрагментами кода.

+1

ссылки объясняет связывания, хотя и не особенно в C: HTTP : //en.wikipedia.org/wiki/Name_binding – taocp

+0

@taocp Я проверил это. Фактически, википедия является одной из первых ссылок, которые я проверяю на все. –

ответ

3

Формально, нет таких терминов в «родной» С

упрощенное объяснение терминов статическое связывание («раннее связывание») и динамического связывания («позднего связывания»): они чаще всего используются в объектно-ориентированного проектирования, чтобы определить, выполняется ли решение для вызова определенной унаследованной функции-члена во время компиляции или во время выполнения.

Значение виртуальной функции состоит в том, что она является наследуемой функцией, которая вызывается вместо эквивалентной функции в базовом классе, который был унаследован. Если компилятор может определить, имеет ли объект тип «базовый класс» или тип «унаследованный класс» во время компиляции, вы получаете статическое связывание, в противном случае - динамическое связывание. Таким образом, вам понадобится какая-то информация типа времени выполнения (RTTI).

В приведенном выше контексте эти термины имеют смысл только в том случае, если вы используете объектно-ориентированное наследование/полиморфизм в своей программе на C. C не поддерживает языковую поддержку таких механизмов. Это есть возможно реализовать их «вручную» на C, но это утомительно, и код имеет тенденцию быть довольно беспорядочным. Для тех, кто настаивает, есть книга «Объектно-ориентированный дизайн в ANSI-C», который демонстрирует, как это можно сделать.

(Лично я бы не рекомендовать эту книгу, ни для реализации полиморфизма в C. Если вам нужна эта объектно-ориентированное программирование Feaures, только код в C++.)

+0

Итак, до тех пор, пока я не перейду к OOPS, это правило большого пальца для меня достаточно - 'В C есть только статическая привязка. Компилятор берет на себя всю привязку во время компиляции. Никакой динамической привязки вообще. И история!' .Правильно? –

+0

@ Rüppell'sVulture: на самом деле вы * можете * подделывать динамическое связывание в C-указателях функций (это бит о его реализации «вручную»), но он обычно не «чувствует» себя как динамическое связывание на C++, если это делает любое чувство. –

+0

@ Rüppell'sVulture Виртуальная таблица функций участника может быть смоделирована с помощью массива указателей на функции и т. Д. Вы можете реализовать все необходимые функции ООП на C, для них не существует никакой привлекательной языковой поддержки. – Lundin

1

C - статически скомпилированный язык, на самом деле он не имеет «динамического связывания».

Вы можете сделать это вручную с помощью API: например, POSIX 'dlopen(), но я бы смутился назвать это «привязкой», хотя в некотором смысле я предполагаю, что это так.

+0

Рассмотрите случай распределения памяти 'dynamic', используя' malloc() '. Возможно, я не использовал правильный термин' dynamic'. Но как бы вы описали такие случаи, как 'malloc()' в C? –

+1

@ Rüppell'sVulture Кажется, что некоторая терминологическая неверная совпадение; привязка обычно используется для обозначения процесса «соединения» имен (имена переменных, имена функций, имена типов, любые) с их «значением» на языках программирования.Это не имеет ничего общего с распределением памяти ... – unwind

+0

Но если это так, разве это не критическое и важное «соединение», которое должно выполняться во время компиляции для ВСЕХ языков программирования? Как возможно, и с помощью какой процедуры может быть такое «соединение», быть разрешенным во время выполнения на ЛЮБОЙ языке? И какая возможная польза будет получена от этого? И в чем же необходимость? –

 Смежные вопросы

  • Нет связанных вопросов^_^