2013-03-04 72 views
1

我是一名學生程序員,學習我的第一本語言「加速C++」。我處於作者正在解釋包含函數的頭文件和源文件的時候。在本書提供的解釋中,作者具有包含函數定義的頭文件,但由於源文件也具有函數的定義,因此似乎是多餘的。在編程C++時,這種情況下頭文件的要點是什麼?C頭文件和源文件

示例:頭文件。

#ifndef MEDIAN_H 
#define MEDIAN_H 

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

#endif // MEDIAN_H 

然後包含函數的源文件,以確定等級的中位數:

// 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]; 
} 

的median.h被複制到即使源已經定義vector<double> vec 本書中位數函數源文件解釋爲無害,實際上是一個好主意。但我只想更好地理解這種冗餘的原因。任何解釋都會很棒!

+0

頭部通常具有有限的**聲明**。實施有完整的定義。 – chris 2013-03-04 03:49:28

+4

當您開始使用具有多個文件的項目時,您會看到需要。 – jman 2013-03-04 03:50:40

+0

http://stackoverflow.com/questions/1305947/why-does-c-need-a-separate-header-file – jman 2013-03-04 03:52:25

回答

2

頭文件的目的是除了文件實際執行有問題的功能之外的文件。從本質上講,您需要告訴C++編譯器哪些函數存在,以及它們看起來如何調用它們。

例如,假設我有一個函數doStuff.cpp:

#include "median.h" 

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

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

C++編譯器需要知道的是,功能median()有您的具體參數和返回值,而不是別人的median()

+0

這非常有意義,而且非常簡單,我無法相信我無法理解這個概念。謝謝你的明確解釋。 – 2013-03-04 04:04:16

0

是的,這是多餘的,但標準的做法。 C/C++編譯器在使用函數之前需要聲明。在某些情況下,這意味着你絕對必須在實現之前有一個聲明,例如,如果你有相互遞歸的函數。如果項目中有多個文件,那麼您還需要包含您從另一個文件中使用的函數的聲明 - 最簡單的方法是將它們分開。

也就是說,聲明/實現也保持獨立於庫中的可重用性。想象一下,你寫了一個非常大的有用函數庫,而其他人也想使用它們。他們需要向編譯器提供他們將使用的函數的聲明,所以他們使用你的.h文件。