2013-03-04 3 views
1

저는 "Accelerated C++"라는 책으로 제 1 언어를 배우는 학생 프로그래머입니다. 필자는 저자가 헤더 파일과 함수를 포함하는 소스 파일을 설명하는 시점에 있습니다. 책이 설명을 제공하는 연습에서 작성자는 함수에 대한 정의가 들어있는 헤더 파일을 가지고 있지만 소스 파일에도 함수에 대한 정의가 있으므로 중복 된 것처럼 보입니다. C++을 프로그래밍 할 때이 경우 헤더 파일의 요점은 무엇입니까?C 헤드 파일과 소스 파일

예 : 헤더 파일.

#ifndef MEDIAN_H 
#define MEDIAN_H 

#include <vector> 
double median(std::vector<double>); 

#endif // MEDIAN_H 

는 다음 기능을 포함하는 소스 파일 등급의 중간 값을 결정 :

median.h는 소스가 이미 정의 vector<double> vec 책이있다하더라도 중간 기능의 소스 파일로 복사
// source file for the `median' function 
#include <algorithm> // to get the declaration of `sort' 
#include <stdexcept> // to get the declaration of `domain_error' 
#include <vector>  // to get the declaration of `vector' 

using std::domain_error; using std::sort; using std::vector; 

#include "median.h" 

// compute the median of a `vector<double>' 
// note that calling this function copies the entire argument `vector' 
double median(vector<double> vec) 
{ 
#ifdef _MSC_VER 
    typedef std::vector<double>::size_type vec_sz; 
#else 
    typedef vector<double>::size_type vec_sz; 
#endif 

    vec_sz size = vec.size(); 
    if (size == 0) 
     throw domain_error("median of an empty vector"); 

    sort(vec.begin(), vec.end()); 

    vec_sz mid = size/2; 

    return size % 2 == 0 ? (vec[mid] + vec[mid-1])/2 : vec[mid]; 
} 

무해하고 실제로는 좋은 생각이라고 설명합니다. 그러나 나는 그런 중복성에 대한 이유를 더 잘 이해하고 싶다. 어떤 설명이 좋을 것입니다!

+0

헤더에는 일반적으로 ** 선언 **이 있습니다. 구현에는 완전한 정의가 있습니다. – chris

+4

여러 파일이있는 프로젝트 작업을 시작할 때 필요성을 알 수 있습니다. – jman

+0

http://skackoverflow.com/questions/1305947/why-does-c-need-a-separate-header-file – jman

답변

2

헤더 파일의 목적은 해당 기능을 실제로 구현하는 파일 이외의 파일에 포함됩니다. 본질적으로 C++ 컴파일러에게 어떤 함수가 있는지, 그리고 함수를 호출하기 위해 어떻게 보이는지를 알려줄 필요가 있습니다.

#include "median.h" 

std::vector<double> my_vector; 
double my_median; 

void do_stuff(){ 
    my_median=median(my_vector); 
} 

C++ 컴파일러는 함수 median() 사용자의 특정 인수가 있음을 알고 다른 사람의 median()에 반대 값을 반환 할 필요가 :

예를 들어, 내가 함수 doStuff.cpp가 있다고 가정 해 보자.

+0

이것은 완벽하게 이해할 수 있으며, 너무 간단해서 그 개념을 이해할 수 없다고는 믿을 수 없습니다. 명확한 설명에 감사드립니다. –

0

예, 중복되었지만 표준 사례입니다. C/C++ 컴파일러는 함수를 사용하기 전에 선언을 요구합니다. 경우에 따라서는 구현하기 전에 반드시 선언이 있어야 함을 의미합니다 (예 : 상호 재귀 함수가있는 경우). 프로젝트에 여러 개의 파일이있는 경우 다른 파일에서 사용중인 함수 선언을 포함시켜야합니다. 가장 쉬운 방법은 파일을 분리하는 것입니다.

즉, 선언/구현은 라이브러리의 재사용을 위해 별도로 유지됩니다. 당신이 유용한 함수의 매우 큰 라이브러리를 작성하고 다른 누군가가 그것을 사용하기를 원한다고 상상해보십시오. 컴파일러에게 그들이 사용할 함수의 선언을 제공해야하므로 .h 파일을 사용합니다.

관련 문제