2014-11-03 3 views
2

저는 몇 년 동안 프로그래머입니다.코드에 .h 파일을 많이 포함합니다.

필자는 항상 .c 파일에 필요한 .h 파일 만 포함시켜야한다고 말했습니다. 아무것도 더, 아무것도 덜.

하지만 물어 봅시다 - 왜?

오늘의 컴파일러를 사용하여 프로젝트의 전체 파일을 포함 할 수 있으며 컴파일 시간에 큰 영향을 미치지 않습니다.

많은 정의, 매크로 및 전처리 명령을 포함하는 OS .h 파일을 포함하는 것에 대해 이야기하는 것이 아닙니다.

"MyProjectIncludes.h"하나만 포함하십시오. 그것은 오직 말할 것이다 :

#pragma once 
#include "module1.h" 
#include "module2.h" 
// and so on for all of the modules in the project 

당신은 무엇을 말합니까?

+15

* "프로젝트의 전체 파일을 포함 할 수 있으며 컴파일 시간에 큰 영향을 미치지 않습니다."* 그런 다음 매우 큰 코드 기반으로 작업하지 않습니다. – CoryKramer

+2

컴파일 시간뿐만 아니라 건물 시간도 고려하십시오. 빌드 프로세스는 컴파일이 필요한 모듈과 그렇지 않은 모듈 간의 관계를 결정합니다. 따라서 변경되지 않고 변경된 파일에 의존하지 않는 모듈을 컴파일하는 것은 시간과 자원을 낭비하는 것입니다. –

+2

이것은 미리 컴파일 된 헤더 뒤에있는 이론입니다. 헤더의 큰 공을 컴파일 한 다음 다시 컴파일하지 않고 모든 소스 파일에 결과를 읽습니다. –

답변

3

헤더가 너무 많아서 .c 파일을 컴파일하는 데 시간이 오래 걸리지 않습니다. 앞에서 말했듯이 몇 가지 추가 헤더를 포함하면 해당 파일의 컴파일 시간이 크게 달라지지 않을 것입니다.

실제 문제는 모든 .c 파일에 "마스터"헤더 파일이 포함되면 .h 파일을 바꿀 때마다 .c 파일은 모두으로 다시 컴파일해야합니다. 사실 모든 .c 파일을 모든 .h 파일에 종속 시켰습니다. 따라서 무의미한 작업을하더라도 새로운 하나의 파일 만 사용하는 새로운 #define을 추가하면 전체 프로젝트를 다시 컴파일해야합니다. 팀과 함께 일하면서 모든 사람이 헤더 파일을 자주 변경하는 경우 악화됩니다.

전체 프로젝트를 다시 빌드하는 데 걸리는 시간이 1 분 미만인 경우에는 그다지 중요하지 않습니다. 편의를 위해 소규모 프로젝트에서 제안한 것을 수행했음을 인정합니다.그러나 모든 것을 다시 빌드하는 데 몇 분이 걸리는 대형 프로젝트 작업을 시작하면 하나의 파일을 다시 작성해야하는 것과 모든 파일을 다시 작성해야하는 것의 차이점을 알 수 있습니다.

1

빌드 시간에 영향을줍니다. 또한, 가지고있는 위험을 감수해야합니다. circular dependency

1

일반적으로 실제로 의존하는 헤더가 변경되지 않는 한 모듈을 다시 컴파일하지 않으려 고합니다. 소규모 프로젝트의 경우 이는 중요하지 않을 수 있으며 글로벌 "include_everything.h"파일은 프로젝트를 단순하게 만듭니다. 그러나 대규모 프로젝트의 경우 컴파일 시간이 매우 중요 할 수 있으므로 가능한 한 모듈 간 종속성을 최소화하는 것이 좋습니다. 불필요한 헤더를 최소화하는 것은 하나의 접근 방법입니다. Pimpl 패턴, 인터페이스 및 공장 등을 사용하여 포인터 또는 참조에 의해서만 참조되는 유형의 전방 선언을 사용하는 것은 모듈 간의 종속성을 줄이기위한 모든 접근법입니다. 이러한 단계를 수행하면 컴파일 시간이 단축 될뿐 아니라 시스템을 테스트하기가 쉬우 며 일반적으로 수정하기도 쉽습니다. 당신이 훨씬하여 컴파일 시간을 해가되지 않습니다 추가 파일을 포함 말한 것처럼

는이 주제에 다소 일자 참조 불구하고, John Lakos "Large Scale Software Design".

-1

물론 우수한하는. 여러분이 제안한 것과 마찬가지로, 1 include 라인을 사용하여 모든 것을 버리는 것이 훨씬 편리합니다.

.c 파일에서 사용하고있는 파일이 정확히 .h 인 경우 낯선 사람이 코드를 더 잘 이해할 수 있다고 생각하지 않습니까? 처음에는 코드에 버그가 있고 그 버그가 .h 개의 파일에있는 경우 정확히 확인할 파일 수는 .h입니다.

+0

아닙니다. 각 h 파일에는 몇 가지가 더 포함되어 있으며 여러 파일이 포함되어 있습니다. 나는 모든 파일에 .h 파일 목록을 포함하고있다. 꽤 귀찮다. – user972014