반드시 중복되는 것은 아닙니다. 별도의 헤더 파일과 소스 파일이 있다는 것은 소스 파일이 헤더 파일에 대한 정의를 제공하는 한 src와 헤더 파일을 서로 바꿀 수 있다는 것을 의미합니다.
.h 파일에는 헤더에 사용 된 사항 만 포함되어야합니다. 헤더에 io 선언이 없다면 예를 들어 stdio가 필요하지 않습니다. 대신 printf를 사용하는 경우에는 src 파일에만 있어야합니다.
그러나 사용할 수있는 헤더 하나가 특정 인클루드를 필요로하는 반면 다른 헤더는 그렇지 않은 경우가있을 수 있습니다 (예 : 하나의 헤더가 다른 헤더보다 더 제한적인 인터페이스 일 때). .h가 포함됩니다.
당신이 제작하는 최종 개체/exe에는 아무런 차이가 없으므로 걱정할 필요가있는 부분은 컴파일 시간이 늘어나지 않으므로, 컴파일 타임을 늘릴 필요가있을 때를 대비하여 포함하는 것이 좋습니다. 어떤 시점에서 다른 .h 파일.
편집 : 더 구체적인 예 inc1.h
#ifndef INC1_H
#define INC1_H
inc1_struct {
int x;
};
#endif
inc2.h
#ifndef INC2_H
#define INC2_H
#include "inc1.h"
void inc2_f();
struct inc1_struct *inc2_callinc1();
#endif
prog.cpp 사용법 #include "inc1.h" 사용법 #include "inc2.h"
#INCLUDE 사용법 #include
void inc2_f() {
printf("inc2_f\n");
}
struct inc1_struct *inc2_callinc1() {
return (struct inc1_struct*) malloc(sizeof(struct inc1_struct));
}
int main(int argc, char **argv) {
struct inc1_struct *s = inc2_callinc1();
return 0;
}
이 컴파일,하지만 당신은 노출하지 않으려는 말할 수 것
그런 다음 inc2.h 파일에 inc1.h을 포함 할 필요가 없습니다 inc2.h
에서
struct inc1_struct *inc2_callinc1();
, 그러나 prog.cpp에서 inc2_callinc1() 정의를 삭제하지 않으려면 inc1.h를 포함해야합니다.
감사합니다. 나는 이것을 고려했다. 그러나 그것의 독서가 편집을 상당히 늦출 것이라고 생각하지 않았다. – Anonymous
gcc 및 다른 컴파일러가 헤더 파일을 캐시하고 include guard를 자동으로 인식 할 수 있다고 들었습니다 (http://www.efnetcpp.org/wiki/Include_guards). 이것에 대한 성능 저하는 거의 없을 것입니다. –
프로젝트 크기에 따라 다릅니다. 컴파일하는 데 2 분이 걸리면 차이를 느끼지 못할 것입니다. 우리는 매년 # include-dependency-spring-cleaning을 진행합니다.이 클리닝은 30 분의 재건 중 5-10 분을 면도합니다. 어떤 사람들은 심지어 한 발 더 나아간다고 들었습니다. 말하자면, 300 개의 .cpp 파일을 컴파일하고 연결 한 다음, # 50 개의 파일을 포함하는 6 개의 .cpp 파일이 있기 때문에 컴파일러는 더 적은 단위로.그들은 컴파일 시간을 절반으로 줄 였지만, 우리의 경우 컴파일러의 기억을 날려 버렸습니다. – Crashworks