헤더 파일에 무엇이 있고 무엇이 없어야합니까? [닫은] 파일로 해당 형식을 정의하는

헤더 파일에 절대 포함해서는 안되는 것은 무엇입니까?

예를 들어, 상수가 많은 문서화 된 산업 표준 형식으로 작업하는 경우 헤더 파일로 해당 형식을 정의하는 것이 좋습니다 (해당 형식의 구문 분석기를 작성하는 경우)?

헤더 파일에는 어떤 기능이 들어가야합니까?

어떤 기능을 사용해서는 안됩니까?



답변

헤더에 넣을 내용 :

  • #include헤더가 일부 소스 파일에 포함 된 경우 헤더를 컴파일 할 수 있도록하는 데 필요한 최소 지시문 세트입니다 .
  • 공유해야하고 전처리기를 통해서만 달성 할 수있는 것들의 전 처리기 기호 정의 C에서도 전 처리기 기호는 최소한으로 유지하는 것이 가장 좋습니다.
  • 헤더 본문에서 구조 정의, 함수 프로토 타입 및 전역 변수 선언을 컴파일 할 수있게하는 데 필요한 구조의 전달 선언.
  • 여러 소스 파일간에 공유되는 데이터 구조 및 열거의 정의
  • 링커가 정의를 볼 수있는 함수 및 변수에 대한 선언
  • 인라인 함수 정의이지만 여기서주의하십시오.

헤더에 속하지 않는 것 :

  • 무질서한 #include지시. 이러한 무관심은 재 컴파일 할 필요가없는 것들의 재 컴파일을 야기하며 때때로 시스템이 컴파일 할 수 없도록 만들 수 있습니다. #include헤더 자체에 다른 헤더 파일이 필요하지 않은 경우 헤더에 파일을 넣지 마십시오 .
  • 의도는 전 처리기 이외의 메커니즘, 어떤 메커니즘에 의해 달성 될 수있는 전 처리기 기호.
  • 많은 구조 정의. 그것들을 별도의 헤더로 나눕니다.
  • 추가가 필요 #include하거나 변경 될 수 있거나 너무 큰 함수의 인라인 정의 . 이러한 인라인 함수는 팬 아웃이 거의 없어야하며 팬 아웃이있는 경우 헤더에 정의 된 항목으로 현지화되어야합니다.

최소한의 #include진술은 무엇입니까?

이것은 사소한 질문으로 판명되었습니다. TL; DR 정의 : 헤더 파일에는 직접 사용되는 각 유형을 직접 정의하거나 해당 헤더 파일에 사용 된 각 함수를 직접 선언하는 헤더 파일이 포함되어야하지만 다른 것은 포함해서는 안됩니다. 포인터 또는 C ++ 참조 유형은 직접 사용 자격이 없습니다. 순방향 참조가 선호됩니다.

무료 #include지침을 위한 장소가 있으며 , 이것은 자동화 된 테스트입니다. 소프트웨어 패키지의 모든 헤더 파일에 대해 다음을 자동으로 생성 한 후 컴파일합니다.

#include "path/to/random/header_under_test"
int main () { return 0; }

컴파일은 깨끗해야합니다 (즉, 경고 나 오류가 없어야합니다). 불완전한 유형 또는 알 수없는 유형에 관한 경고 또는 오류는 테스트중인 헤더 파일에 누락 된 #include지시문 및 / 또는 전달 선언이 없음을 의미합니다. 참고 : 테스트 통과라고해서 #include지시어가 충분 하지 않다는 의미는 아닙니다 .


답변

이미 말한 것 외에도.

H 파일에는 항상 다음이 포함되어야합니다.

  • 소스 코드 문서 !!! 최소한 함수의 다양한 매개 변수 및 리턴 값의 목적은 무엇입니까?
  • 헤더 가드, #ifndef MYHEADER_H #MYHEADER_H 정의 … #endif

H 파일은 다음을 포함해서는 안됩니다.

  • 모든 형태의 데이터 할당.
  • 기능 정의. 경우에 따라 인라인 함수가 드문 예외 일 수 있습니다.
  • 라벨이 붙은 모든 것 static.
  • 나머지 응용 프로그램과 관련이없는 Typedef, #define 또는 상수

(또한 일정하지 않은 전역 / 외부 변수를 어디에서나 사용해야 할 이유는 없지만 다른 게시물에 대한 토론입니다.)


답변

나는 결코 결코 말하지 않을 것이지만, 파싱 될 때 데이터와 코드를 생성하는 문장은 .h 파일에 있으면 안됩니다.

매크로, 인라인 함수 및 템플릿은 데이터 또는 코드처럼 보일 수 있지만 구문 분석 할 때 코드를 생성하지 않고 대신 사용할 때 코드를 생성합니다. 이러한 항목은 종종 하나 이상의 .c 또는 .cpp에서 사용해야하므로 .h에 속합니다.

필자의 의견에 따르면 헤더 파일에는 해당 .c 또는 .cpp에 대한 최소한의 실용적인 인터페이스가 있어야합니다. 인터페이스에는 #defines, class, typedef, 구조체 정의, 함수 프로토 타입 및 전역 변수에 대한 덜 선호되는 extern 정의가 포함될 수 있습니다. 그러나 선언이 하나의 소스 파일에서만 사용되는 경우 .h에서 제외되고 대신 소스 파일에 포함되어야합니다.

일부는 동의하지 않을 수 있지만 .h 파일에 대한 개인적 기준은 컴파일 할 수있는 다른 모든 .h 파일을 #include한다는 것입니다. 경우에 따라 이것은 많은 파일이 될 수 있으므로 포함 파일의 큰 트리를 포함하지 않고 클래스의 객체에 대한 포인터를 사용할 수 있도록 클래스에 대한 순방향 선언과 같은 외부 종속성을 줄이는 효과적인 방법이 있습니다.


답변

헤더 파일의 구성은 다음과 같습니다.

  • 타입과 상수 정의
  • 외부 객체 선언
  • 외부 함수 선언

헤더 파일에는 객체 정의가 포함되어서는 안되며 형식 정의와 객체 선언 만 포함되어야합니다.


답변

구문 분석 할 때 데이터 및 코드를 생성하는 명령문은 .h파일 에 없어야 합니다. 필자의 견해로는 헤더 파일에는 해당하는 .c또는 에 대한 실제적인 인터페이스 만 있어야합니다 .cpp.