2011-11-21 72 views
2

作爲相當新的C++,我不太明白一些指令我遇到如:裏面的Structs用C++的#define

#ifndef BOT_H_ 
#define BOT_H_ 

#include "State.h" 

/* 
    This struct represents your bot in the game of Ants 
*/ 
struct Bot 
{ 
    State state; 

    Bot(); 

    void playGame(); //plays a single game of Ants 

    void makeMoves(); //makes moves for a single turn 
    void endTurn();  //indicates to the engine that it has made its moves 
}; 

#endif //BOT_H_ 

什麼我不明白是「的#ifndef BOT_H_」和「#定義 - #ENDIF」

從我收集的東西,它定義如果在預編譯器在它看起來它尚未定義的常量BOT_H_。我實際上並不知道它裏面的結構是一個常量,它是如何讓我訪問它裏面的函數的。

我也不明白爲什麼我們這樣做?我之前使用過C++,而且沒有使用.h文件,所以它可能很容易丟失。

回答

3

它並沒有定義,它的值是結構常數。它用一個空值定義一個常量。

它的存在,使得頭的內容不包括兩次。基本上,它說是這樣的:

if (!bot_h_included) 
{ 
    bot_h_included = true; 

    // code from the header 
} 
+0

@downvoter,照顧評論你認爲與這個答案扭曲? – svick

+0

謝謝,我現在明白了! –

10

這被稱爲一個include guard,以防止頭文件的內容不被包含(#include)超過一次。

即,它防止了頭文件中的內容被複制到該來#include它時,它已經包含(#include)之前它的文件。

#define沒有爲struct定義常量,但它只是定義了一個沒有值的常量。如果該常量是之前定義的,則該結構將不會被重新聲明。

+0

@SethCarnegie:添加了澄清。 – AbdullahC

1

這就是所謂的頭文件保護它停止編譯器在編譯或包括代碼不止一次它類似於pragma once

5

這就是所謂的「包括衛士」更多。它可以保護您免受包含多次頭的頭文件的重定義。還有非標準的#pragma once可以做同樣的事情,但可能不會在任何地方支持。

+0

+1,這是迄今爲止最接近完全正確的答案。 –

0

只是一個側面說明,有一次我看到了很多在MVC兼容的編譯器,而只是一個幾個星期前,我與HP-UX工作,我不建議使用#pragma而HP-CC不支持#pragma一次,我強烈建議使用#ifndef/#define組合。

+0

我建議同時使用,首先是編譯指示,然後是警衛。一些編譯器不會像他們執行'#pragma once'那樣優化include guard,並多次打開頭文件。 – Xeo

+0

@Xeo:哪個?沒有那麼多支持'#pragma once'的編譯器(GCC和MSVC,iirc);和那些正確優化標頭警衛。 – MSalters