Внешние встроенные функции должны иметь один и тот же адрес во всех единицах перевода. Как, черт возьми, это достигается?

#c #inline

#c #встроенный

Вопрос:

Согласно стандарту, внешние встроенные функции должны иметь один и тот же адрес во всех единицах перевода.

Как это достигается в компиляторе? Я имею в виду, когда я компилирую какую-то единицу перевода, я понятия не имею, каким будет другой TU. Итак, как я могу везде иметь один и тот же адрес?

Ответ №1:

Это зависит от реализации, но обычно это решается компоновщиком. Каждая скомпилированная единица перевода создаст объектный файл, содержащий копию функции, помеченную каким-либо образом, чтобы компоновщик знал, что он должен ожидать (и принимать) дубликаты. Компоновщик включит один из них, отбросит остальные и разрешит любые ссылки на функцию.

Комментарии:

1. А как насчет библиотек? Или я далеко зайду?

2. @Let_Me_Be: Статические библиотеки обычно представляют собой просто набор объектных файлов и поэтому, вероятно, будут содержать несколько копий функции, которые будут разрешены позже при подключении к программе. Общие библиотеки обычно связаны как программа, поэтому тогда можно исключить несколько копий.

Ответ №2:

Простая стратегия: каждый раз inline , когда определяется такая функция, компилируйте ее в object time, как если бы это была обычная функция. Затем, во время соединения, обнаружьте дублирующиеся функции и удалите их, оставив по одной копии каждой. Так работали компиляторы C (также с использованием шаблонов) около 10 лет назад. Не уверен, как они это делают в наши дни.