Здравствуйте, ezdoctor, Вы писали:
E>Ну вот хотя бы мой пример (переносим все в один заголовок и инстанциируем класс одним и тем же типом из двух разных модулей): E>Сравниваем со случаем, когда в определении класса те же методы объявлены как inline:
E>В первом случае возникнет ошибка линковки (линковщик найдет определение шаблонных методов в двух разных модулях), во втором случае этой ошибки с гарантией не возникнет.
Мне вот даже интересно стало, как ты понял мои слова:
Просто укажи его не в объявляении, а в определении
Конечно же, в первом случае возникает ошибка линковки, потому, ты ключевые слова inline убрал вообще. А вот если бы ты сделал так, как я говорю, то все было бы в порядке:
Здравствуйте, rean, Вы писали:
R>> Можешь проверить, обычная inline функция из какого-нибудь пространства имен, не объявленная static, будет имеет один и тот же адрес во всех единицах трансляции.
R>Это благодаря тому что линкер найдет одинаковый код и объединит его, а не потому что так должно быть.
Это так, потому, что это является требованиям стандарта языка:
5.6 Program and linkage
9 Two names that are the same (Clause 6) and that are declared in different scopes shall denote the same variable, function, type, template or namespace if
(9.1) — both names have external linkage or else both names have internal linkage and are declared in the same translation unit; and
И функция не перестает иметь external linkage только оттого, что ее объявили inline. inline — это всего лишь способ сказать линкеру, чтобы он не удивлялся, когда будет встречать дубликаты определений в разных единицах трансляции. Указатель на inline функцию может быть использован в качестве параметра шаблона и это значение обязано быть одинаковым во всей программе.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[8]: Explicit instantiation of template template method
Здравствуйте, rean, Вы писали:
R>2. Линкер не сможет найти inline функцию из одного cpp файла в другом. Просто потому что ее имени не существует. Это ограничение языка.
Ты путаешь мягкое с теплым. Функция с external linkage спокойно может быть использована в других единицах трансляции — в этом и состоит сущность внешнего связывания.
Я догадываюсь, что это может быть не совсем просто для понимания, но попробуй порассуждать над такой штукой, как виртуальные inline функции-члены.
10.1.6 The inline specifier
6 An inline function or variable shall be defined in every translation unit in which it is odr-used and shall have exactly the same definition in every case (6.2). [ Note: A call to the inline function or a use of the inline variable may be encountered before its definition appears in the translation unit. —end note ] If the definition of a function or variable appears in a translation unit before its first declaration as inline, the program is ill-formed. If a function or variable with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required. An inline function or variable with external linkage shall have the same address in all translation units. [ Note:A static local variable in an inline function with external linkage always refers to the same object. A type defined within the body of an inline function with external linkage is the same type in every translation unit. —end note ]
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rean, Вы писали:
R>1. Функция, объявленная как inline, транслируется только в пределах одной единицы трансляции. Что автоматически означает, что в каждой единице трансляции будет свой код. R>2. Линкер не сможет найти inline функцию из одного cpp файла в другом. Просто потому что ее имени не существует. Это ограничение языка.
Я вот еще о чем подумал. Вполне возможно, что ты еще путаешь такие сущности, как единица трансляции и объектный файл. Единица трансляции — это просто исходный текст программы, получившийся на выходе от препроцессора:
1 The text of the program is kept in units called source files in this International Standard. A source file together with all the headers (20.5.1.2) and source files included (19.2) via the preprocessing directive #include, less any source lines skipped by any of the conditional inclusion (19.1) preprocessing directives, is called a translation unit. [ Note: A C++ program need not all be translated at the same time. —end note ]
И да, inline функции должны быть в ключены в каждую единицу трансляции, в которой они используются.
Линкер же не работает с единицами трансляции — линкер работает с объектными файлами. И состав этих файлов — это глубоко implementation defined level. Что в них находится и как работает линкер, мы не знаем. Знаем мы только то, что я писал уже раньше:
10.1.6 The inline specifier
6 An inline function or variable shall be defined in every translation unit in which it is odr-used and shall have exactly the same definition in every case (6.2). [ Note: A call to the inline function or a use of the inline variable may be encountered before its definition appears in the translation unit. —end note ] If the definition of a function or variable appears in a translation unit before its first declaration as inline, the program is ill-formed. If a function or variable with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required. An inline function or variable with external linkage shall have the same address in all translation units. [ Note:A static local variable in an inline function with external linkage always refers to the same object. A type defined within the body of an inline function with external linkage is the same type in every translation unit. —end note ]
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rean, Вы писали:
R>Надо откомпилировать, чтобы убедиться о том, что не откомпилируется. А потом освежить свою память, порыскав в интернете или хотя бы прочитав то что я писал.
Вот объясни мне, пожалуйста, откуда у тебя такая уверенность, что это я должен выполнять твои задания, а не наоборот?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[10]: Explicit instantiation of template template method
Здравствуйте, rean, Вы писали:
R>Откомпилируете, увидите сообщение об ошибке. Прочтете его. Потом промотаете по треду и найдете мои фразы, где я сообщаю о том почему видите сообщение об ошибке. R>Увидите те места, где вам показалось, что я говорю о другом, увидите как вы на это среагировали и понеслись вносить новые доводы. R>Увидите, что там нет никаких адресов, нет виртуальных функций. Это все возникло в самом начале реагирования.
У меня к тебе встречное предложение. Чтобы разрешить наш спор, мы можем даже временно пойти на такое страшное преступление, как нарушение ODR. Определим по-разному одну и ту же inline функцию в двух единицах трансляции и убедимся, что каждом из модулей будет вызываться одна и та же функция, а не в каждом своя, как ты, вероятно, ожидаешь.
Здравствуйте, rean, Вы писали:
R>Остапа понесло. Пятая попытка изменить смысл. Теперь пришлось использовать новое супер-оружие «не одинаковые инлайны». R>Меня не интересуют ни адреса inline функций, ни виртуальные inline функции ни какие-либо еще.
Я тебе просто наглядно продемонстрировал, как в одной единице трансляции вызывается inline функция, определенная в другой. Что полностью опровергает твои утверждения, сделанные здесь, об использовании inline функций.
R>rg45 — вы зануда. Неужели вам никак не ясно, что я не хочу с вами обсуждать все эти, возможно интересные вам случаи применения inline? R>Найдите другого собеседника и с ним и обсуждайте. Я лишь отвечал автору сообщения и только в рамках обозначенного контекста применения inline — когда inline функцию не нашел линковщик.
Видишь ли, все просто — не хочешь общаться — не пиши. Тебя же никто не принуждает к этому.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rean, Вы писали:
R>Это отличается от рассматриваемого случая, как и все остальные случаи. Я говорил четко в пределах случая, когда инлайн функция ищется линковщиком по причине того что отсутствует в текущей еденице трансляции. R>Рассматривался один узкий конкретный случай. Другие случаи мне не интересны. Если уловили в этом другие смыслы — это ваше. Так что что такое «Что полностью опровергает твои утверждения, сделанные здесь, об использовании inline функций» — понятия не имею. Я про это вообще ничего не говорил. Это ваши домыслы и желание выискивать недочеты у других.
Инлайн работает только в пределах одной единицы компиляции. Иначе говоря, в каждом CPP файле будет своя копия, такая же как в другом файле, но своя копия.
Поэтому найтись инлайн из одного cpp в другом не может никак.
2. Линкер не сможет найти inline функцию из одного cpp файла в другом. Просто потому что ее имени не существует. Это ограничение языка.
И то, и другое — чушь, не имеющая к реальности никакого отношения. Почему — я уже объяснил ссылками на стандарт языка и подкрепил практическим примером.
--
Не можешь достичь желаемого — пожелай достигнутого.
R>>Инлайн работает только в пределах одной единицы компиляции. Иначе говоря, в каждом CPP файле будет своя копия, такая же как в другом файле, но своя копия.
R>>Поэтому найтись инлайн из одного cpp в другом не может никак.
R>Вот ведь наглец. Вырвал фразы из контекста, внося в них новые смыслы, вставил свои героические потуги подменить линковку на выяснение адреса функции и теперь самодовольно радуется, что будто прав.
Что я вырвал из контекста? Пройди по ссылке — это полный текст первого же твоего сообщения в той ветке. И, кстати говоря, в ветке, начатой мной.
И, если ты не в курсе, выяснение адреса функции — это как раз то, чем линкер и занимается:
Для большинства компиляторов, один объектный файл является результатом компиляции одного файла с исходным кодом. Если программа собирается из нескольких объектных файлов, компоновщик собирает эти файлы в единый исполнимый модуль, вычисляя и подставляя адреса вместо символов, в течение времени компоновки (статическая компоновка) или во время исполнения (динамическая компоновка).
R>Вот ведь наглец. R>вы неадекват, представляющий опасность для общества. R>Вон, уже плюсик поставили придурку R>Вот же придурошный R>Можете своими ссылками и примерами подтереться, R>только жопу свою не порвите
Ты в самом деле полагаешь, что оскорбления в мой адрес могут дать тебе какое-то преимущество? Или это все уже — полная потеря контроля над собой?
--
Не можешь достичь желаемого — пожелай достигнутого.