문제

나는 헤더가있는 요점을 잘 이해하지 못한다. 건식 원리를 위반하는 것 같습니다! 헤더의 모든 정보는 구현에 포함되어 있습니다.

도움이 되었습니까?

해결책

컴파일 프로세스를 단순화합니다. 단위를 독립적으로 컴파일하려면 다른 모든 파일 전체를 가져올 필요없이 연결될 부품을 설명 할 내용이 필요합니다.

또한 코드 숨기기를 허용합니다. 구현을 배포하지 않고도 기능을 사용할 수 있도록 헤더를 배포 할 수 있습니다.

마지막으로 인터페이스를 구현에서 분리하는 것을 장려 할 수 있습니다.

그들은 이러한 문제를 해결하는 유일한 방법은 아니지만 30 년 전에는 좋은 문제였습니다. 우리는 오늘날 언어에 헤더 파일을 사용하지 않았지만 2009 년에는 발명되지 않았습니다.

다른 팁

Java, Eiffel 및 C#과 같은 많은 현대 언어의 건축가는 귀하와 분명히 동의합니다. 이러한 언어는 구현에서 모듈에 대한 메타 데이터를 추출합니다. 그러나 그 자체로 헤더의 개념은 그것을 배제하지 않습니다. 컴파일러가 .h 컴파일하는 동안 파일 a .c, 예를 들어, 다른 언어의 컴파일러와 마찬가지로 암시 적으로 수행됩니다. 일반적인 현재 C 컴파일러가 수행하지 않는다는 사실은 언어 설계 문제가 아닙니다. 구현 문제입니다. 분명히 이러한 기능에 대한 사용자의 요구는 없으므로 컴파일러 공급 업체는이를 구현하지 않습니다.

언어 디자인 선택으로, 별도의 .h 파일 (사람이 읽을 수 있고 편집 가능한 텍스트 형식으로)은 두 세계의 최고를 제공합니다. 원하는 경우 아직 존재하지 않는 모듈 구현을 기반으로 클라이언트 코드를 별도로 컴파일 할 수 있습니다. .h 손으로 파일; 또는 귀하 (공급하는 컴파일러 구현이 터무니없는 가정 ;-) .h 구현에서 자동으로 파일을 컴파일하는 부작용으로 파일.

C, C ++, & C가 계속 번성한다면 (분명히 오늘날에도 잘하고 있습니다. ;-), 수동으로 헤더를 쓰지 않기 위해서는 당신과 같은 요구가 커지면 결국 컴파일러 작가는 "헤더 생성"옵션을 제공해야합니다. 두 세계의 최고 "이론적으로 머물지 않을 것입니다!-)

C가 작성되었을 때 사용 가능한 컴퓨터의 기능에 대해 조금 생각하는 데 도움이됩니다. 주 메모리는 킬로와드에서 측정되었으며 반드시 그 중 많은 것은 아닙니다. 디스크는 더 크지 만 많지는 않았습니다. Serrious Storage는 Grumpy Operators에 의해 손으로 장착 된 릴 투 릴 테이프를 의미했습니다. 1 MIPS 기계였습니다 빨리 비명을 지르고 있습니다. 그리고이 모든 제한으로 당신은해야했습니다 공유하다 그것. 아마도 다른 사용자들과 함께.

공간을 줄이는 모든 것 또는 편집의 시간 복잡성은 큰 승리였습니다. 그리고 헤더는 둘 다합니다.

헤더가 제공하는 문서를 잊지 마십시오. 모듈을 사용하기 위해 알아야 할 것이 일반적으로 있습니다. 나는 내 부분이 Looong Sourcecode를 스캔하여 사용해야하는 것이 무엇인지, 어떻게 호출하는지를 배우고 싶지 않습니다 ... 어쨌든이 정보를 추출하여 효과적으로 헤더 파일이 발생합니다. 물론 Modern IDE와 더 이상 문제가되지는 않지만 일부 기존 C 코드로 작업하면 사용법 및 사전 및 사후 조건에 대한 주석이 포함 된 수작업 헤더 파일을 갖는 것을 좋아합니다.

소스, 헤더 및 추가 문서를 동기화하는 데 대한 또 다른 캔은 벌레의 또 다른 캔입니다 ...

언어 프로세서의 이진 출력 파일을 검사하는 전체 아이디어는 C 발명되었을 때 이해하기 어려웠을 것입니다. .h 파일. 불리는 시스템이있었습니다 유쾌한 그것은 그와 비슷한 일을했지만, 이국적이며 군사 프로젝트에 독점적으로 갇혀있었습니다. (나는 유쾌한 프로그램을 본 적이 없다. 나는 그것에 대해 들었다.)

따라서 C가 모듈화에 대한 일반적인 디자인 패턴을 나왔을 때 "확인되지 않은 것"이었습니다. .text 기호가 .text 및 .data에 .data에 링크 할 수 있다는 제한이있을 수 있지만 그럴 수 있습니다. 즉, 오늘의 컴파일러는 일반적으로 한 번에 하나의 소스 파일을 처리 한 다음 링커는 운이 좋으면 "I 'm a function symbol"vs "입니다. 데이터 기호 ".

따라서 실제로 컴파일러가 부르는 것을 이해한다는 아이디어는 다소 새로운 것이 었습니다.

오늘도 완전히 가짜 헤더를 만들면 아무도 당신을 가장 많이 잡지 않습니다. AOT 컴파일러. CLR 언어 및 Java와 같은 영리한 것들이 실제로 클래스 파일에서 물건을 인코딩합니다.

그렇습니다. 장기적으로는 헤더 파일이 없을 것입니다.

아니요 당신은 Java에 헤더가 없지만 인터페이스가 있고 나는 모든 심각한 Java Guru는 다른 프로젝트/시스템에서 사용하는 모든 것을 인터페이스 및 구현으로 정의 할 것을 권장합니다.

Java 인터페이스 정의에 통화 서명, 유형 정의 및 컨텐츠가 포함되어 있습니다.

대부분의 C 헤더 파일에는 통화 서명, 유형 정의 및 상수가 포함됩니다.

따라서 모든 PRATICAL 목적을 위해 C/C ++ 헤더 파일은 인터페이스 정의 일 뿐이므로 좋은 것으로 간주되어야합니다. 이제 나는 헤더 파일 (marcros, 상수 등)에서 무수한 다른 것들을 정의 할 수 있다는 것을 알고 있지만 C :-의 멋진 세계의 일부일뿐입니다.

int function target () {
    // Default for shoot
    return FOOT;
}

세부 사항을 읽으려면 이것

헤더 파일에는 일반적으로 클래스, 서브 루틴, 변수 및 기타 식별자의 전방 선언이 포함됩니다. 하나 이상의 소스 파일에 표준화 된 식별자를 선언하려는 프로그래머는 이러한 식별자를 단일 헤더 파일에 배치 할 수 있으며, 여기에는 다른 코드가 헤더 내용이 필요할 때마다 포함 할 수 있습니다.

C 표준 라이브러리 및 C ++ 표준 라이브러리는 전통적으로 헤더 파일에서 표준 기능을 선언합니다.

그리고 다른 사람에게 도서관을 구현하지 않고 도서관을 사용할 선언을주고 싶다면 어떻게해야합니까?

또 다른 답변이 지적한 것처럼 헤더의 원래 이유는 매우 간단하고 제한된 도구를 사용하여 플랫폼에서 구문 분석/컴파일을 쉽게 만들기 때문입니다. 2 개의 플로피가있는 기계를 갖는 것은 큰 진전 이었으므로 컴파일러를 하나에, 다른 하나에 코드를 가질 수 있습니다.

코드를 헤더 및 소스 파일로 나누면 선언 및 정의를 나눕니다. 헤더 파일을 살펴보면 가지고있는 것을 볼 수 있고 구현 세부 정보를 보려고 지팡이가있는 경우 소스 파일로 이동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top