前處理器變數

遠方的楓葉發表於2015-05-27

   前處理器變數,在有的書中又叫前處理器常量,都是一個意思

  •     為了避免名字衝突,習慣上處理器變數的所有字母一律大寫
  •     前處理器變數在整個程式中是唯一的
  •     前處理器變數只有兩種狀態,已定義或未定義,用於避免標頭檔案的多重包含而引起的重複定義  

         假設定義一個前處理器常量SALESITEM_H,可以用如下方式來預防多次包含同一標頭檔案:

     #ifndef SALESITEM_H
     #define SALESITEM_H
     // Definition of Sales_itemclass and related functions goes here
     //....
     //..
     #endif
     條件指示

    #ifndef SALESITEM_H
     測試 SALESITEM_H 前處理器變數是否未定義。如果 SALESITEM_H 未定義,那麼#ifndef 測試成功,跟在#ifndef 後面的所有行都被執行,直到發現#endif。相反,如果SALESITEM_H 已定義,那麼#ifndef 指示測試為假,該指示和#endif 指示間的程式碼都被忽略。

     舉個例子:

       定義一個標頭檔案

      test_A.h

      test_B.h

       程式原始檔為

      main.c

        如果標頭檔案test_A.h中包含test_B.h,而在原始檔中又包含標頭檔案test_A.h和 test_B.h,這時你就會發現在原始檔中test_B.h被包含了兩次,一次是直接包含,一次是包含test_A.h時間接包含的,如果 test_B.h中有類的定義,這時就會發生重定義這樣低階的錯誤。有些同學就有疑問了,你明明知道了test_B.h已經在test_A.h中包含過了為什麼還要在原始檔中再次包含test_B.h呢?這不是多此一舉嗎?我想告訴你的是當你的程式比較龐大時,你就不會這樣想了,標頭檔案多的讓你頭皮發麻,你壓根就看不出來他們之間的包含關係。



    順便在說說  #include<test.h>和#include"test.h"的區別

    #include<test.h>包含的標頭檔案是標準庫標頭檔案,編譯器會在設定好的路徑搜尋test.h標頭檔案,系統標頭檔案可能以檔案方式儲存,也可能以系統特有的其他格式儲存。

   #include"test.h"包含的標頭檔案是自定義的標頭檔案,編譯器在包含該標頭檔案的原始檔所在的位置開始搜尋,使用者定義的標頭檔案以檔案方式儲存。

   至於帶字尾.h 和不帶字尾的標頭檔案得區別,C++標準化後的庫檔案包含的時候都不帶字尾,並且增加了名字空間這個機制,簡化了程式的編寫,一般自己定義的標頭檔案加上字尾,這個看個人愛好了


相關文章