1. 程式人生 > >標頭檔案管理 使用#ifndef防止多重包含 部分標頭檔案用途及其中的函式介紹

標頭檔案管理 使用#ifndef防止多重包含 部分標頭檔案用途及其中的函式介紹

       1、 在同一個檔案中只能將同一個標頭檔案包含一次。記住這個規則很容易,但很可能在不知情的情況下將標頭檔案包含多次。例如,可能使用包含了另一個頭檔案的標頭檔案。有一種標準的C++技術可以避免多次包含同一個標頭檔案。它是基於前處理器編譯指令#ifndef(即if not define)的。下面的程式碼片段:

        #ifndef COORDIN_H_

        ...

        #endif

         意味著僅當以前沒有使用前處理器編譯指令#define定義名稱COORDIN_H_時,才處理#ifndef和#endif之間的語句。

         通常,使用#define語句來建立符號常量,如下所示:

         #define MAXIMUM 4096

          但只要將#define用於名稱,就足以完成名稱的定義,如下所示:

          #define COORDIH_H_

           

         使用這種技術是為了將檔案內容包含在#ifndef中:

 #ifndef COORDIH_H_
 #define COORDIH_H_

//place include file contents here

 #endif

          編譯器首次遇到該檔案時,名稱COORDIH_H_沒有定義(我們根據include檔名來選擇名稱,並加上一些下劃線,以建立一個在其他地方不太可能被定義的名稱)。在這種情況下,編譯器將檢視#ifndef和#endif之間的內容(這正是我們希望的),並讀取定義COORDIN_H_的一行。如果在同一個檔案中遇到其他包含coordin.h的程式碼,編譯器知道COORDIN_H_已經被定義了,從而調到#endif後面的一行上。注意,這種方法並不能防止編譯器將檔案包含兩次,而只是讓它忽略除第一次包含之外的所有內容。大多數標準C和C++標頭檔案都是用這種防護(guarding)方案。

 

2、部分標頭檔案

cstdlib:C++中的一些庫函式標頭檔案,包含了rand()和srand()的原型。

cstime:時間函式標頭檔案,包含了time()的原型。

cmath:數學計算相關函式。

 

(1)rand()函式和srand()函式

int main()
{
    ......
    srand(time(0));
    ......
    while(cin>>target)
    {
       ......
       direction=rand()%360;
       step.set(dstep,direction,'p');
       ......
    }

    return 0;
}

         rand()函式:它返回一個從0到某個值(取決於實現)之間的隨機整數。該程式使用求模運算元來獲得一個0~359的角度值。rand()函式將一種演算法用於一個初始種子值來獲得隨機數,該隨機值將用作下一次函式呼叫的種子,依此類推。這些數實際上是偽隨機數,因為10此連續的呼叫通常將生成10個同樣的隨機數(具體取決於實現)。不過,srand()函式允許覆蓋預設的種子值,重新啟動另一個隨機數序列。該程式使用time(0)的返回值來設定種子。time(0)函式返回當前時間,通常為從某一個日期開始的秒數(更廣義地,time()接受time_t變數的地址,將時間放到該變數中,並返回它。將0用於地址引數,可以省略time_t變數宣告)。因此,下面的語句:

          srand(time(0));

在每次執行程式時,都將設定不同的種子,使隨機輸出看上去更為隨機。

 

                要使用rand()產生隨機數時,需在此之前使用srand()使產生的隨機數更加隨機。