3 / 3 / 0
Регистрация: 03.06.2019
Сообщений: 64
1

Разница между ".inl" и просто ".cpp" файлами

17.03.2020, 23:14. Показов 7072. Ответов 5
Метки нет (Все метки)

Всем привет! Недавно узнал о существовании ".inl" файлов. Как я понял, они используются при реализации inline-функций и/или для реализации функций с шаблонными параметрами. Но до этого я использовал ".cpp" файлы с этой же целью. Так в чем разница между ними, и зачем использовать ".inl", когда можно обойтись и просто ".cpp"?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2020, 23:14
Ответы с готовыми решениями:

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло",...

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов), которые разделяются...

Создать классы "Computer", "Software", "User" и реализовать взаимодействие объектов этих типов между собой
Помогите решить задачку,нужна в инст на экзамен. Составить программу реализующую: ...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование)
Разработать программу с использованием наследования классов, реализующую классы: − воин;...

5
16488 / 8982 / 2204
Регистрация: 30.01.2014
Сообщений: 15,601
18.03.2020, 00:10 2
Лучший ответ Сообщение было отмечено Black Fregat как решение

Решение

NuMeRiC_, нельзя обойтись. cpp-файл - это основа для единицы трансляции, каждая единица трансляции компилируется отдельно, независимо. Это позволяет вынести определения переменных и функций и компилировать их отдельно один раз. А определения шаблонов и inline-функций должны иметь доступное определение в точке использования, отсюда невозможность вынести их в какую-то одну единицу трансляции. Так что я не знаю как вы использовали "до этого" для этих целей cpp, но это явно было возможно, только если файл с использованием ваших шаблонов и inline-функций был только один. Так что inl-файлы это просто еще один вид заголовочных файлов, для "эмуляции" разделения объявления и определения шаблонов и inline-функций, чтобы основной заголовочный файл не загромождался. А вынести их в cpp вы все равно нормально не сможете, просто по определению.

Добавлено через 12 минут
Таких умников, которые упорно пытаются выносить шаблоны в cpp тут каждый месяц по 5 штук появляется. Поиском не пользуются, книжки не читают, плодят темы только. Вот, можете полюбопытствовать:
Не собирается проект с шаблонным классом: "undefined reference"
Undefined reference to
Undefined reference при линковке
Undefined reference при работе с шаблонным класом
Не понятный undefined reference to `unsigned long long f<unsigned long long, void>
Undefined reference при использовании шаблонов
Работа с шаблонами и ошибка "Undefined reference"
Шаблон класса complex. Ошибка undefined reference to `complex<double>::SetRe(double)'
2
Вездепух
Эксперт CЭксперт С++
10426 / 5696 / 1552
Регистрация: 18.10.2014
Сообщений: 14,054
18.03.2020, 00:17 3
Лучший ответ Сообщение было отмечено Croessmah как решение

Решение

Цитата Сообщение от NuMeRiC_ Посмотреть сообщение
Недавно узнал о существовании ".inl" файлов. Как я понял, они используются при реализации inline-функций и/или для реализации функций с шаблонными параметрами.
Имя файла (и его расширение) не имеет никакого существенного значения. Значение имеет только то, как вы будете использовать этот файл: как самостоятельную единицу трансляции или как хедер, т.е. включаемый (через #include) файл.

Традиционно расширение .cpp дается самостоятельным единицам трансляции. А расширения .inl, .h или .hpp дается хедерам.

Но все это не более чем "джентльменское соглашение". Никто вам не запрещает включать .cpp файлы через #include, если вы понимаете, что делаете. Однако это соглашение частично поддерживается и компиляторами, по каковой причине рекомендуется все таки его придерживаться.

Цитата Сообщение от NuMeRiC_ Посмотреть сообщение
Но до этого я использовал ".cpp" файлы с этой же целью. Так в чем разница между ними, и зачем использовать ".inl", когда можно обойтись и просто ".cpp"?
Если под ".cpp файлами" вы имеете в виду самостоятельные единицы трансляции, то вы что-то выдумываете: использовать их для определения шаблонов или инлайновых функций вы никак не могли, ибо работать это в общем случае не будет.

Необходимости в выделении отдельного класса включаемых файлов .inl обычно нет. Разве что это бывает полезно при реализации инлайновых функций для классов циклически ссылающихся друг на друга. Так что в данном случае вы не столько "узнали о существовании .inl файлов", сколько пронаблюдали чью-то частную и не очень распространенную манеру организации файлов проекта.
0
3 / 3 / 0
Регистрация: 03.06.2019
Сообщений: 64
18.03.2020, 10:55  [ТС] 4
Спасибо! На счет ".срр", я делал все, как было в учебниках, по которых учился. Тойсть в чем дело: там definition(пусть будет так) функций помещалась в .hpp ну или .h. В то же время declaration, сама реализация выносилась в отдельный .срр файл, обычно с таким же именем.
Нигде там я не наблюдал .inl файлов. Так уж сложилось. Теперь буду заново учиться работать с шаблонами функций по-нормальному.
0
Don't worry, be happy
17781 / 10545 / 2035
Регистрация: 27.09.2012
Сообщений: 26,514
Записей в блоге: 1
18.03.2020, 10:56 5
Цитата Сообщение от NuMeRiC_ Посмотреть сообщение
Тойсть в чем дело: там definition(пусть будет так) функций помещалась в .hpp ну или .h. В то же время declaration, сама реализация выносилась в отдельный .срр файл, обычно с таким же именем.
definition - определение.
declaration - объявление.
0
16488 / 8982 / 2204
Регистрация: 30.01.2014
Сообщений: 15,601
18.03.2020, 10:59 6
Цитата Сообщение от NuMeRiC_ Посмотреть сообщение
Нигде там я не наблюдал .inl файлов.
Это сугубо практическая сторона вопроса.
Что касается того, что при инстанцировании шаблона нужно его определение, то в любом нормальном учебнике про это не быть не могло.
Вывод о том, что в таком случае шаблоны должны быть в заголовочном файле (если планируется их использование в множестве cpp) напрашивается сам собой и вы могли его сделать сами, даже без явных слов об этом в учебнике.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2020, 10:59
Помогаю со студенческими работами здесь

В чем разница между "Порядок выполнения программ на языке C" и "Структура программы на языке C"
в конспектах у себя не нашел, хоть и записывал все, что объяснял преподаватель. вот, собственно,...

Необходимо между каждой парой цифр поставить знак "<", ">" или "="
Дана строка, состоящая из цифр. Необходимо между каждой парой цифр поставить знак &quot;&lt;&quot;, &quot;&gt;&quot; или &quot;=&quot;....

Разница между понятиями "Обход в прямом направлении" и "Итерационный прямой обход"
Ребятаа, обьясните чем различается: Обход в прямом направлении и Итерационный прямой обход ...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс"
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru