2009-06-06 3 views
11

나는 최근 C을 배웠으며, 내 교과서 중 하나에서 ".r"확장자를 가진 파일에 대한 참조를 발견했습니다. 이제 상상할 수있는 것처럼 "r"또는 "파일 확장자 r"검색은 생산적이지 않으므로 나를 도울 수 있는지 궁금합니다.C의 "개인 헤더"란 무엇입니까?

그것은 저자는 그것이 "개인 헤더"이라고 언급 다음 코드 블록

#include "new.r" 

static const struct Class _String = { 
    sizeof(struct String), 
    String_ctor, String_dtor, 
    String_clone, String_differ 
}; 

const void * String = & _String; 

에 나타납니다,하지만 난 그가 정확히 무엇인지에 관해서는 더 명확 수 있었다 바랍니다.

+2

나는 단지 흥미 롭습니다 ... 어떤 교과서를 읽고 있습니까? –

+1

개인 헤더가 무엇인지,이 코드가 무엇을하는지는 모르지만 .r은 중요하지 않습니다. 파일 확장자는 단지 제안 일뿐입니다. – Zifre

+0

이 책이 무엇인지 분명히 말해주십시오. – jmucchiello

답변

7

인스턴스에 대해이 OO 라이브러리에 의해 사용되는 일반적인 클래스 정보를 보유 - - (올바르게 이해한다면) 내부 표현을 유지하고 별도의 헤더 파일에있는 클래스의 기능에 대한 액세스를 제어하여 정보을 숨기는 방법.

클래스의 구현 만이 .r 파일을 참조하므로 클래스에 대한 "개인 헤더"로 간주 될 수 있습니다. 클래스 외부의 인터페이스 인 .h 헤더 파일이 사용되었습니다.그림으로

는, 클래스는 세 개의 파일로 구성 될 수있다

Circle.h /* Header file with external interfaces, such as methods. */ 

Circle.r /* Representation file for internal use within the class, such as 
       structs that define the internal states. */ 

Circle.c /* Implementation of the Circle class. */ 

그런 다음 규칙에 따라 Circle 클래스를 사용하는 프로그램이 클래스에 액세스 할 수있는 인터페이스와 Circle.h 파일을 포함 할 수있다. Circle.rCircle 클래스의 구현에서 엄격하게 사용되고 다른 클래스에서는 사용되지 않으므로 "개인 헤더"가됩니다.

r 파일 확장자는 기본적으로 사용되는 규칙이며 "공식적인"것이 아니며 항상 사용되는 것이 아닙니다. 편의상 사용하고 파일 확장자가 h 인 일반 헤더 파일과 구별하기 위해 사용됩니다.

+0

당신은 참고가있어! ANSI-C를 쳐다 보는 객체 지향 프로그래밍! 케이크가 있습니다. 어디를 봐야하는지 알 필요가 있습니다. – Ziggy

5

C 컴파일러는 파일 확장자에 특별한 의미를 부여하지 않으므로 .r 확장자를 사용하면 작성자가 규칙을 통해 무언가를 나타낼 수 있습니다. 이 책에 익숙하지 않아서 그게 뭔지 모르겠지만 컴파일러가 파일 이름에 특별한 의미를 붙이지 않는다는 것을 안심하십시오.

+0

사실 GCC는 파일 확장자를 사용하여 .c 파일을 전 처리기/컴파일러/링커에, .cpp 파일을 C++ 전처리 기/C 컴파일러/링커에, .o 파일을 링커에만 제공합니다 등등. 물론 이것은 명령 행 옵션에 의해 무시 될 수 있습니다. 그리고 .r은 (내가 아는 한) 인식 된 확장자 중 하나가 아니므로, 여러분이 틀렸다는 것을 말하는 것이 아니라, 행동을 언급할만한 가치가있다. –

+1

@David : 명령 행에 지정된 파일에는 해당되지만 전 처리기를 통해 #include 된 파일에는 해당되지 않습니다. –

11

".r"파일 확장자는 실제로 해당 작성자가 사용하는 많은 개인적인 규칙을 의미하지는 않습니다. 어떤 사람들은 그들의 개인 헤더를 "new_p.h"또는 그와 비슷한 이름으로 지정할 것입니다.

기본적으로 개인 헤더는 소비자가 아니라 특정 구현 파일에만 포함되도록 의도 된 헤더입니다. 언어 나 컴파일러와 아무런 관련이 없습니다. 코딩 컨벤션 일뿐입니다.

+1

그것이 나 였다면 아마도 다른 헤더가 필요하지 않은 것들을 비활성화하기 위해 #ifdef 블록과 함께 foo.c에 대한 하나의 헤더 foo.h를 기대할 것입니다. (아마도 #ifndef 또는 변수 앞에 "extern"줄이 거의 없습니까?). - - - - 저자는 * .h가 "게시"/ "공개"된 규칙을 사용하지만 * .r은 "지적 재산권"또는 일부 부패를 방지하지 않습니다. – Roboprog

+0

"NewP.h"또한 다소 인기가 있으며, 예를 들어 X11에서 사용되고 "new_p.h"는 Qt에서 사용됩니다. – ninjalj

2

내가 본 다양한 오픈 소스 프로젝트에서 알 수있는 한, 개인 헤더는 특정 코드 (파일 또는 여러 파일)에 의해서만 사용되도록 고안된 헤더입니다. 예를 들어, 일부 파일이 서로의 심볼/선언에 액세스해야하지만, 다른 심볼에서 이러한 심볼/선언에 액세스하지 말아야 할 때 유용합니다. 또는 프로토 타입을 .c 파일에서 분리하는 데 사용할 수 있습니다.

일반 또는 일반 헤더는 대개 특별한 'include'디렉토리에 저장되는 반면, 개인 헤더는 제공되는 특정 코드 근처에 있습니다.

'도트 r'연장에 관해서는, 나는 결코 전에 그것을 전해 듣지 않았다 것은. 내가 본 개인 헤더는 다른 모든 사람들과 마찬가지로 '점 H'로 명명됩니다.

0

다른 사람들이 말했듯이 .r은 중요하지 않습니다. 개인 헤더는 아마도 파일을 사용하는 파일을 제외하고는 포함되지 않아야한다는 것을 의미합니다. 그것은 일종의 그것은 "클래스"String에 대한 const "Class"개체 들고 크기, 생성자, 소멸자, 등을 만드는 C에서 C++를 모방처럼

이 코드 보인다. 이 구조는 내가하는 .r 파일이 클래스의 "표현"로 사용됩니다 Object-oriented Programming with ANSI-C,에 .r 파일을 만난있는 C.

0

나는 보통 개인 헤더에 대한 본 적이 관용구는 다음과 같은 명명 규칙을 사용하는 것입니다

  • module.h에 - 공용 인터페이스를; 클라이언트 코드가 필요로하는 이름, 구조 및 기능 가능한 경우 구조체를 정의하지 말고 이름을 선언하고 인터페이스에서 불투명 포인터를 사용하십시오. SDK를 제공하는 경우 게시 된 헤더가됩니다.
  • modulep.h - 개인 헤더; 선언 & 모듈 내에서 사용되는 정의 - 클라이언트 코드는 이들을 포함 할 필요가 없습니다. SDK를 제공하는 경우이 SDK는 게시되지 않습니다.
  • module.c - 구현입니다. 이 모듈은 module.h와 modulep.h를 모두 사용합니다.