C ++에서 .inl 파일의 중요성


108

.inl 파일에 선언을하면 어떤 이점이 있습니까? 언제 똑같이 사용해야합니까?


3
FWIW, 나는 .inl 파일을 싫어합니다. 왜 필요 이상으로 코드를 분할합니까?
Shog9

10
@ shog9 : 구현에서 인터페이스를 분리합니다. 모든 복잡한 구현 세부 사항으로 인해 인터페이스를 읽기가 너무 어렵 기 때문에 항상 C # 및 Java 파일을 싫어했습니다.
Martin York

8
@Martin-불행히도 C ++는 우리에게 인터페이스와 헤더의 구현 부분, .cpp 파일의 나머지 구현의 잘못된 조합을 제공합니다. 인라인 함수를 피하거나 .inl 파일에 넣더라도 pimpl 관용구를 종교적으로 사용할 수 없다면 개인 멤버의 성가신 세부 정보로 인터페이스를 복잡하게 만들어야합니다.
Michael Burr

5
예, 헤더가 인터페이스와 구현을 분리한다는 주장을 이해하지 못했습니다. 그들은 분명히 그렇지 않습니다. 인터페이스에는 모든 개인 멤버가 포함되지 않아야합니다.
jalf

@LokiAstari : 공정하게 말하면 Java / C #은 인터페이스 개요를 자동으로 제공하는 매우 좋은 도구를 가지고 있습니다. 다른 방법으로 표현할 수 있습니다. C ++에서는 컴퓨터로 완전히 해결할 수있는 문제를 수동으로 해결해야합니다.
bluenote10

답변:


139

.inl파일은 필수가 아니며 컴파일러에 특별한 의미가 없습니다. 코드를 읽을 수있는 사람에게 힌트를 제공하는 코드 구조화 방법 일뿐입니다.

.inl두 가지 경우에 파일을 사용 합니다.

  • 인라인 함수의 정의.
  • 기능 템플릿의 정의.

두 경우 모두, 나는 그때, 다른 파일이 포함 된 헤더 파일에 함수의 선언을 넣어#include.inl 헤더 파일의 맨 아래에 파일을.

인터페이스와 구현을 분리하고 헤더 파일을 좀 더 쉽게 읽을 수 있기 때문에 마음에 듭니다. 구현 세부 사항에 관심이있는 경우 .inl파일을 열고 읽을 수 있습니다. 그렇지 않다면 그럴 필요가 없습니다.


2
실제로, 구현에서 인터페이스를 분리하는 것이 대부분입니다.
Pavel Minaev

1
또한 인라인 정의에 사용되는 .ipp 및 .ixx와 템플릿 1에 사용되는 .tpp 및 .txx도 보았습니다.
AProgrammer

1
예를 들어, GNU 표준 C ++ 라이브러리는 .tcc템플릿 구현 파일에 사용 합니다.
musiphil 2013 년

1
@NickMeyer glm는 위에서 언급 한 것과 똑같은 방식으로 .hpp 및 .inl을 사용합니다. 좋은 답변을 주셔서 감사합니다. :)
legends2k 2013 년

헤더 같은 건가요?
Aaron Franke

90

닉 마이어 말이 맞습니다. 컴파일러는 포함하는 파일의 확장자를 신경 쓰지 않습니다. 따라서 ".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"파일을 포함 할 수 있으며 제대로 작동합니다.

다시 말하지만, 포함 된 파일의 접미사 이름은 실제로 중요하지 않고 용도 만 중요합니다.


5
이것은 별거의 실질적인 이점 (또는 필요성)을 설명하며 답으로 선택되어야합니다.
musiphil 2013 년

함수가 인라인이 아닌 경우 구현 부분에 대한 표준 .cpp 파일을 사용 하시겠습니까?
Bublafus

@Bublafus : If the function were not inline, you would you standard .cpp file for the implementation part?: 아마도. 템플릿은 일반적으로 .CPP 파일에서 숨길 수없는 코드의 예이므로이 경우 .INL 파일은 필수입니다.
paercebal

32

아무도 언급하지 않았기 때문에 :

.inl 파일을 사용하여 인라인 함수를 저장하면 컴파일 속도를 높이는 데 유용 할 수 있습니다.

선언이 필요한 곳에 선언 (.h) 만 포함하고 필요한 곳에 인라인 구현 (.inl) 만 포함하는 경우 (예 : .h가 아닌 .cpp 및 기타 .inl 파일에서만 가능) 헤더 종속성에 유익한 효과.

이것은 상호 작용하는 클래스가 많은 대규모 프로젝트에서 중요한 승리가 될 수 있습니다.


7
+1 : 수백만 줄의 코드와 수천 개의 파일을 관리 할 때 세상은 확실히 다른 곳입니다.
gatorfax

그래서 헤더 파일에 .inl을 포함해서는 안됩니다. 인라인 함수는 선언과 구현이 한 번에 도달 할 수 있어야하기 때문에 항상 .inl을 헤더 파일의 맨 아래에 넣어야한다는 느낌을 받았습니다.
Icebone1000 2013 년

1
Icebone1000은 헤더를 포함하는 모든 모듈이 반드시 인라인 함수를 사용하기를 원하는 것은 아니므로 구현을 읽을 필요가 없으며 사용되지 않는 경우 존재하지 않아도됩니다.
Andy J Buchanan

1
컴파일러가 번역 단위를 포함하고 결합하기 위해 더 많은 작업을해야하기 때문에 어떻게 더 빠를 수 있는지 이해할 수 없습니다.
Nikos

1
@Nikos 나는 그가 헤더 파일에 모든 인라인 함수를 넣는 것보다 더 빠르다는 것을 의미한다고 생각합니다.
CoffeeTableEspresso

3

내 경험상 .inl 파일은 인라인 함수를 정의하는 데 사용됩니다. .inl 파일에있는 경우 파일을 헤더에 포함하여 인라인 함수를 가져오고 .c 파일에 포함하여 일반 함수 정의를 가져올 수 있습니다.

이렇게하면 동일한 소스가 인라인 함수를 지원하지 않는 컴파일러 및 지원하는 컴파일러에서 더 쉽게 작업 할 수 있습니다.

일반적으로 모든 C ++ 컴파일러가 인라인 함수를 지원하므로 C ++ 코드에서는 자주 사용되지 않는 직선 C 코드와 함께 사용됩니다.


C 지원을 받기 위해이 작업을 수행하는 것이 중요하지 않습니다. C의 경우 조건부 #define inline static로하고 헤더에 인라인 함수를 정의합니다.
Pavel Minaev

나는 이것이 동일한 함수의 여러 복사본이 바이너리로 끝나는 것을 피할 수 있다고 생각합니다. 나는 .inl 파일이 이런 방식으로 사용되는 것을 보았고 이것이 유일한 기술 (또는 최고)이 아니라고 말하는 것입니다.
Michael Burr

1

인라인 코드가 포함 된 "헤더"파일의 명명 규칙 일 뿐이라고 생각합니다. .h 파일은 정의를 포함 할 수 있고 .inl 파일은 템플릿에 필요한 인라인 코드를 포함 할 수 있습니다.

파일의 목적을 명확하게하기위한 명명 규칙 이상의 것이 있다고 믿지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.