В чем преимущества объявления в файле .inl? Когда мне нужно будет использовать то же самое?
В чем преимущества объявления в файле .inl? Когда мне нужно будет использовать то же самое?
Ответы:
.inlфайлы никогда не являются обязательными и не имеют особого значения для компилятора. Это просто способ структурирования вашего кода, который дает подсказку людям, которые могут его прочитать.
Я использую .inlфайлы в двух случаях:
В обоих случаях я помещал объявления функций в заголовочном файле, который включен другими файлами, то я #includeна .inlфайл в нижней части заголовка файла.
Мне это нравится, потому что он отделяет интерфейс от реализации и упрощает чтение файла заголовка. Если вас интересуют детали реализации, вы можете открыть .inlфайл и прочитать его. Если нет, то не обязательно.
.tccфайлы реализации шаблонов.
glmиспользует .hpp и .inl точно так же, как вы упомянули выше. Полезно знать, спасибо за отличный ответ :)
Ник Мейер прав: компилятор не заботится о расширении файла, который вы включаете, поэтому такие вещи, как «.h», «.hpp», «.hxx», «.hh», «.inl», ".inc" и т. д. - это простое соглашение, поясняющее, что файлы должны содержать.
Лучшим примером являются файлы заголовков STL, у которых нет вообще никаких расширений.
Обычно файлы ".inl" содержат встроенный код (отсюда и расширение ".inl").
Эти файлы ".inl" необходимы, когда у вас есть цикл зависимости между кодом заголовка .
Например:
// A.hpp
struct A
{
void doSomethingElse()
{
// Etc.
}
void doSomething(B & b)
{
b.doSomethingElse() ;
}
} ;
И:
// B.hpp
struct B
{
void doSomethingElse()
{
// Etc.
}
void doSomething(A & a)
{
a.doSomethingElse() ;
}
} ;
Вы не сможете его скомпилировать, в том числе с использованием прямого объявления.
Решение состоит в том, чтобы разбить определение и реализацию на два типа файлов заголовков:
hpp для объявления / определения заголовкаinl для реализации заголовкаЧто можно увидеть в следующем примере:
// A.hpp
struct B ;
struct A
{
void doSomethingElse() ;
void doSomething(B & b) ;
} ;
И:
// A.inl
#include <A.hpp>
#include <B.hpp>
inline void A::doSomethingElse()
{
// Etc.
}
inline void A::doSomething(B & b)
{
b.doSomethingElse() ;
}
И:
// B.hpp
struct A ;
struct B
{
void doSomethingElse() ;
void doSomething(A & a) ;
} ;
И:
// B.INL
#include <B.hpp>
#include <A.hpp>
inline void B::doSomethingElse()
{
// Etc.
}
inline void B::doSomething(A & a)
{
a.doSomethingElse() ;
}
Таким образом, вы можете включить любой файл ".inl" в свой собственный источник, и он будет работать.
Опять же, суффиксные имена включаемых файлов не так важны, как их использование.
If the function were not inline, you would you standard .cpp file for the implementation part?:: Возможно. Шаблоны - это примеры кода, который обычно нельзя скрыть в файлах .CPP, поэтому в этом случае файл .INL будет обязательным.
Поскольку никто об этом не упомянул:
Использование файлов .inl для хранения встроенных функций может быть полезно для ускорения компиляции.
Если вы включаете только объявления (.h) там, где вам нужны объявления, и включаете только встроенные реализации (.inl) там, где они вам нужны (т.е., вероятно, только в .cpp и других файлах .inl, а не в .h), он может иметь благотворно влияет на зависимости ваших заголовков.
Это может быть значительной победой для более крупных проектов с большим количеством взаимодействующих классов.
По моему опыту, файлы .inl используются для определения встроенных функций. Когда они находятся в файле .inl, файл может быть включен в заголовок для получения встроенных функций и в файл .c для получения обычных определений функций.
Таким образом, один и тот же источник может легче работать с компиляторами, которые не имеют встроенной поддержки функций, а также с компиляторами, которые имеют.
Обычно они используются с прямым кодом C, не часто с кодом C ++, поскольку все компиляторы C ++ поддерживают встроенные функции.
#define inline staticопределите свои встроенные функции в заголовке.
Я считаю, что это просто соглашение об именах для файла «заголовка», включающего встроенный код. это так, что файлы .h могут содержать определения, а файлы .inl содержат встроенный код, необходимый для шаблонов.
Я не верю, что это что-то большее, чем соглашение об именах, чтобы прояснить цель файла