標頭檔案管理 使用#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()使產生的隨機數更加隨機。