LINUX.ORG.RU

C++. Повторяющиеся символы в разных объектных файлах. Шаблоны с одинаковыми аргументами в разных единицах трансляции.


0

1

Если в разных единицах трансляции инстанциирован шаблон какой-то функции с одними и теми же аргументами шаблона, получается один и тот же символ в разных объектных файлах.

Как на это не ругается линкер?

★☆

Последнее исправление: kiverattes (всего исправлений: 1)

шаблоны инлайнятся, либо манглятся специальным образом, потому что инстанс шаблона должен быть полностью доступен в той точке, где он используется. Линкер не ругается также, как и в случе обычной inline функции.

alex_custov ★★★★★
()
Ответ на: комментарий от kiverattes

не помню строчку из стандарта. Факт только в том, что инстанс должен быть полностью доступен (или экспортирован) в точке вызова. Возможно, что компилятор сам решает инлайнить или нет.

Экспортирование инстансов из других TU с помощью export практически нигде не поддерживается.

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

Экспортирование инстансов из других TU с помощью export практически нигде не поддерживается.

Более того, в С++11 от этой фичи отказались, теперь её в стандарте нет.

DarkEld3r ★★★★★
()

Ну напиши обычную функцию и шаблонную. Ну или класс с методами, как больше нравится. Скомпиляй, посмотри readelf, nm. Увидишь разницу между «обычными» и «шаблонными» символами.

const86 ★★★★★
()

Если я правильно помню, некоторые секции в объектниках помечаются как «можно выбросить, если есть другая с тем же именем».

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Если я правильно помню, некоторые секции в объектниках помечаются как «можно выбросить, если есть другая с тем же именем».

Именно, иначе невозможно было бы определять виртуальные методы в теле класса.

То же самое можно делать и для обычных инлайновых функций в GCC с помощью __attribute__((noinline)) — компилятор засунет её в объектник и удалит дубликаты из других единиц трансляции без ошибки на этапе линковки.

Dendy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.