#c #inline
#c #встроенный
Вопрос:
Согласно стандарту, внешние встроенные функции должны иметь один и тот же адрес во всех единицах перевода.
Как это достигается в компиляторе? Я имею в виду, когда я компилирую какую-то единицу перевода, я понятия не имею, каким будет другой TU. Итак, как я могу везде иметь один и тот же адрес?
Ответ №1:
Это зависит от реализации, но обычно это решается компоновщиком. Каждая скомпилированная единица перевода создаст объектный файл, содержащий копию функции, помеченную каким-либо образом, чтобы компоновщик знал, что он должен ожидать (и принимать) дубликаты. Компоновщик включит один из них, отбросит остальные и разрешит любые ссылки на функцию.
Комментарии:
1. А как насчет библиотек? Или я далеко зайду?
2. @Let_Me_Be: Статические библиотеки обычно представляют собой просто набор объектных файлов и поэтому, вероятно, будут содержать несколько копий функции, которые будут разрешены позже при подключении к программе. Общие библиотеки обычно связаны как программа, поэтому тогда можно исключить несколько копий.
Ответ №2:
Простая стратегия: каждый раз inline
, когда определяется такая функция, компилируйте ее в object time, как если бы это была обычная функция. Затем, во время соединения, обнаружьте дублирующиеся функции и удалите их, оставив по одной копии каждой. Так работали компиляторы C (также с использованием шаблонов) около 10 лет назад. Не уверен, как они это делают в наши дни.