2016-02-19 24 views
0

#endif放在#ifndef#define之後的C++頭文件的開頭是否是不好的做法?如果是這樣,爲什麼?爲什麼在.h頁面的結尾處包含#endif?

This question沒有涉及爲什麼#endif是最後 - 這是我特別是谷歌搜索。

例如

//cDate.h 
#ifndef CDATE_H_EXISTS 
#define CDATE_H_EXISTS 

#include <string> 


class cDate { 
    private: 
    std::string day; 
    std::string month; 
    std::string year; 
    public: 
    void setDate(std::string, std::string, std::string); 
    std::string getDate(int); 
}; // end class def 

#endif 

VS

//cDate.h 
    #ifndef CDATE_H_EXISTS 
    #define CDATE_H_EXISTS 
    #endif 

    #include <string> 


    class cDate { 
     private: 
     std::string day; 
     std::string month; 
     std::string year; 
     public: 
     void setDate(std::string, std::string, std::string); 
     std::string getDate(int); 
    }; // end class def 
+2

問自己「#ifndef CDATE_H_EXISTS」的用途是什麼...... –

+0

在C++頭文件的開始處放置#endif是否違反了#ifdef預處理指令的全部目的:爲了避免頭文件的內容被相同的源文件多次包含。 –

+4

[爲什麼在C++頭文件中使用#ifndef和#define](http://stackoverflow.com/questions/1653958/why-are-ifndef-and-define-used-in-c-header-files ) –

回答

1

你需要的,如果它已經處理,以排除的文件的全部內容。

其目的不是#define頭球衛 - 這是一個有用的(ISH)副作用。目的是確保標題內容僅加載一次。

+0

你的答案是完全有道理的 - 不會留下任何問題。謝謝。 –

7

第一個例子,它是include guard

第二個例子,是沒有後衛。

+1

推薦引用該報價只是爲了保持一切猶太教。 – user4581301

+0

很好推薦,現在我只是在想這個報價是不需要的,因爲這是一個基本的概念。刪除它會使答案更加精簡。 – Nik

1

雖然,微妙,差異是巨大的。假設您將#endif放置在頂部的#define語句後面,那麼該定義將完全是空白的,並且如果存在頭文件被多次包含的情況,則該文件仍將被編譯並且會導致問題,因爲什麼都沒有定義。

一旦另一面,該#endif應該是在最後設置定義爲整個文件及其代碼的內容,因此,如果它被包含超過一次,沒有一個文件將是過度執行。

3

它沒有完成它的任務;包括這個頭文件再次包含所有的行。

考慮if語句:

if (condition) { 
    <do something> 
} 

if (condition) { 
    (void) 0; 
} 
<do something> 

條件是#ifndef(如果沒有定義),開口支架是初始狀態下,與閉合支架是#endif

相關問題