![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| 17dufa |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
Добрый день.
Собственно интересует такой вопрос - а почему на определенные в рамках класса функции не ругается линкер, что они already defined? это просто требование стандарта или такое определение чем-то концептуально отличается от определения просто функции? то есть вот такое линкуется
а вот такое нет
*ну и то же самое для
|
||||||
|
|||||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
насколько я помню, функции, реализованные внутри класса, считаются inline
если во втором случае ты перед функцией int f(int i) напишешь слово inline, то он тоже будет линковаться |
|||
|
||||
| 17dufa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
Alek86, точно. никак не мог подумать, что inline влияет на линковку, хотя это закономерно, если с минуту поразмышлять.
|
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Alek86,
правильно помнишь.
|
||||
|
|||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Но компилятор (Microsoft) не будет ругаться, если в двух единицах трансляции определены две одноименные inline функции с одинаковым прототипом (declaration), но с разными реализациями (definition). У них же разные области видимости. Некорректности проявляются только на этапе выполнения такой программы. |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
1. То, что микрософт не ругается еще ни о чем не говорит. 2. Это не отменяет вышесказанного. |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Но все-таки inline-функции не обладают внешними связями и не могут непосредственно видеть друг друга (если определены в разных единицах трансляции), или я ошибаюсь?
Это сообщение отредактировал(а) FCM - 2.11.2009, 15:29 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
инлайн функции ДОЛЖНЫ быть определены во всех единицах трансляции, в которых они используются и если функция со вшешним связыванием объявлена инлайн - она должна быть объявлена инлайн во всех единицах трансляции, в которых используется. А само ключевое слово инлайн на linkage функции никак не влияет. |
|||
|
||||
| 17dufa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
azesmcar, "А само ключевое слово инлайн на linkage функции никак не влияет." Можно подробнее? Я, к сожалению, ни слова не понял.
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
FCM, ключевое слово "inline" - это всего лишь рекомендация компилятору и указание, что данная функция может быть определена в нескольких единицах трансляции. Т.е. если ты пометил функцию встраиваемой, это совсем не значит, что она будет встроена (особенно, в режиме отключенной оптимизации).
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
17dufa
про linkage http://www.cyberguru.ru/programming/cpp/cp...way-page25.html Добавлено через 1 минуту и 40 секунд
более того, даже если она будет встраиваемой в одном участке кода, это не значит что она встраиваемая всегда. Встраивается вызов функции. |
|||
|
||||
| 17dufa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
azesmcar, несколько вопросов:
1. inline и внешнее/динамическое связывание - это как? 2. возвращаясь к первому вопросу, если компилятор положит на inline и таки сгенерит функцию, вернутся ошибки линковки или компилятор будет генерить функцию очень специальным образом? |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
В каком смысле? Обыкновенная функция со внешним связыванием, просто с ключевым словом inline. Я же говорю, инлайн с linkage никак не влияет.
нет, ошибок не будет http://forum.vingrad.ru/forum/topic-275681...tion/index.html последние 3 сообщения. Это сообщение отредактировал(а) azesmcar - 2.11.2009, 16:55 |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
В этих последних 3-х сообщениях есть такие слова
"Однако при помощи inline можно влиять на способ компоновки." Это утверждение ошибочно ? И еще "инлайн функции не подчиняются ему (OneDefinitionRule)". Это так? |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
проще говоря, если компилятор видит inline функцию, то он обрабатывает ее обычным образом, плюс, в тех местах, где считает необходимым, он встраивает ее тело вместо вызова...
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |