宏定義與預定義

上學的時候就沒搞清楚這兩個東東的關係,原本以爲是多麼難得事情,今天仔細瞧瞧就那麼回事。(浮躁的大學哦.....)

宏定義:

其作用就是“換其名曰”,給程序中的一段特殊的代碼--函數,數據取了個簡單明瞭的名字。不過有一點這傢伙的作用範圍是全局的。即使它是在某一個函數塊中定義的。這個其實也容易理解。因爲宏定義是預定義的一種,在我們的程序之前,由預編譯器(Cpp)提前編譯出來了,那個時候程序裏的結構是個啥樣子編譯器壓根就不知道。所以作用範圍是全局的是“必須”的。在C#中宏定義是不被支持的!!俺覺得這個決定是對的。因爲這玩意兒本身就破壞類的封裝性,如果需要全局靜態變量,完全可以定義一個靜態類的靜態成員。

    class Test
    {
        public void test()
        {
            Console.WriteLine(parameters.para);
        }
    }
    static class parameters
    {
        public static string para = "something";
    }


宏定義與靜態變量:

靜態變量與宏定義其實沒啥關係,所謂的靜態,也只是說它存儲的位置實在“全局變量的內存區”但是它使用起來還是有範圍限制的。

宏定義與常量:

宏定義與常量都有“換其名曰”的作用,但是宏定義的作用範圍只能是全局的,而常量是在編譯過程中由編譯器搞出來的,所以常量的作用域有全局和局部之分。如果在一個函數中定義了一個常量,那麼這個常量的作用範圍就僅限於這個函數。而如果在這個函數中定義了一個宏定義,那麼這個宏定義在函數外也是可以訪問定的。爲嘛?因爲人家是在編譯之前就被搞出來的。跟這個函數其實沒多大關係,所以偶感覺如果要定義一個宏,乾脆直接定義在文件頭部分。簡單明瞭。

預定義:

預定義算一種特殊的機制吧,就是有一些變量或函數需要在我們程序被編譯之前就被搞出來,那麼就需要在編譯器發揮作用之前啓動一個叫預編譯器的東西,它會搜索程序裏邊帶"#" 的代碼,然後把它們提前給編譯了。這之後再啓動編譯器進行編譯。預定義指令其實是爲了配合這種機制而定義出來的旨在我們的程序中對需要與處理的代碼段進行標識的一種命令。他的作用包括宏定義,文件包含,和條件編譯。

宏定義我們已經嘮叨完了,文件包含就是我們常見的#include,這裏頭還是要囉嗦一下氣候的規則#include<iostream.h>和#include<iostream>是由於標準的不一樣,由於有些大牛覺得".h"文件作爲頭文件表示不利於統一,所以就早早的把這個給去掉了。還有另外的原因就是<iosteam>和<iostream.h>裏邊的標準也變了,說白了就是不是一個文件了,裏邊的東東發生了變化,用#include<iostream>會包含進去一個比較新版本的iostream(擴展名未知). <>和""的區別在於查找的位置不一樣,<>從標準庫的頭文件中開始查找,""從用戶自定義的頭文件庫中開始查找。

餘下的預定義指令就掛在下邊,比較好理解。可以說預編譯機制是一個“無奈”的機制,預編譯指令最終的歸宿應該是被嵌入到代碼中,與其他的代碼一起被編譯器編譯。

最後---在許多年之後---將Cpp放逐到程序開發環境裏,與其它附加性語言工具放到一起,那裏纔是她應該呆的地方。” 一個大牛說的,瞭解了就行。

#define          宏定義

#undef           未定義宏

#include         文本包含

#ifdef           如果宏被定義就進行編譯

#ifndef          如果宏未被定義就進行編譯

#endif           結束編譯塊的控制

#if              表達式非零就對代碼進行編譯

#else            作爲其他預處理的剩餘選項進行編譯

#elif            這是一種#else和#if的組合選項

#line            改變當前的行數和文件名稱

#error           輸出一個錯誤信息

#pragma          爲編譯程序提供非常規的控制流信息

 

 

文章來源 http://www.cnblogs.com/ppchouyou/archive/2008/07/04/1235360.html

發佈了16 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章