2017-01-15 41 views
2

什麼是「ICT_TOOLS_H__」?它是我在這裏定義的標題,還是它是布爾值,還是1或0的整數?名稱必須與頭文件相同,還是可以是自定義名稱?另外,如果標題包含在多個.cpp文件中,是否使用#ifndef,或者即使它只包含一次?當編譯器第一次通過時,是否定義了「ICT_TOOLS_H__」,並且在其他每次通過時都不重新編譯頭,從而防止同一頭的多個編譯?什麼是「ICT_TOOLS_H__」是什麼?使用#ifndef時正在定義什麼?

#ifndef ICT_TOOLS_H__ //my proff said to start the name with "ICT_", its the programming department 
#define ICT_TOOLS_H__ 


//implementation goes here 

#endif 
+1

他們是包括警衛。請參閱:https://en.wikipedia.org/wiki/Include_guard –

+0

這是一個預處理令牌。查找「預處理器」 –

回答

1

沒有它是用於inclusion guard條件包含一個宏以便在第一總是這個宏沒有定義這樣的條件成功並且內容被添加到源/報頭(其中包括)以及在所述第二時間條件將失敗,因此內容不會再被添加。

當您有多個源/頭文件時,您可以在其中包含兩次或多次頭文件,這非常有用。

//header.h 

#ifndef MY_HEADER_H // the name can be anything 
#define MY_HEADER_H 
// code here (some declarations) 

int value; 

#endif 

//source.cpp 

#include "header.h" 
#include "header.h" 

int main() 
{ 
    value = 0; // for example 

    return 0; 
} 

如果刪除了包含後衛則header.h內容將被添加兩次,結果兩個變量value在那裏,這是一個編譯時錯誤(重新定義)。

+0

那麼我應該使用#ifndef,如果我知道它包含多次?或者你會認爲推廣使用#ifndef更好? – Selim

+0

在頭文件中,建議使用'inclusion guard',但是存在預處理器指令'#pragma once',您只需將它添加到頭部頂部即可,內容將只添加一次。但雜注不是便攜。 – Raindrop7

+1

你應該始終知道的是避免用'_'開始你的包含守護宏,或者使用系統的宏之一像'#define _WIN32' – Raindrop7

0

它們基本上是宏,用於條件編譯。 這是他們如何工作的編譯首先檢查是否有一個在您的案例ICT_TOOLS_H__中調用的已定義宏,如果未定義,那麼#ifndef和#endif之間的整個代碼將被編譯,並且下一行指示它將定義該宏並且將成爲一個不會再編譯它的警衛。

如果代碼編譯超過一次C++ one定義規則被違反。在這裏看到https://en.m.wikipedia.org/wiki/One_Definition_Rule

相關問題