1. 程式人生 > >#ifndef#define#endif的用法【轉載…

#ifndef#define#endif的用法【轉載…


    #define WINDOWS
    
    這樣則編譯下面的命令列:
    #define MYTYPE long
    
    如果在這組條件編譯命令之前曾出現以下命令列:
    #define WINDOWS 0
    
    則預編譯後程序中的MYTYPE都用float代替。這樣,源程式可以不必作任何修改就可以用於不同型別的計算機系統。當然以上介紹的只是一種簡單的情況,可以根據此思路設瞥?a href="javascript:;" onClick="tagshow(event, '%C6%E4%CB%FC');return false;">其它的條件編譯?
    例如,在除錯程式時,常常希望輸出一些所需的資訊,而在除錯完成後不再輸出這些資訊。可以在源程式中插入以下的條件編譯段:
    #ifdef DEBUG
    print ("device_open(%p) ", file);
    #endif
    
    如果在它的前面有以下命令列:
    #define DEBUG
    
    則在程式執行時輸出file指標的值,以便除錯分析。除錯完成後只需將這個define命令列刪除即可。有人可能覺得不用條件編譯也可達此目的,即在除錯時加一批printf語句,除錯後一一將printf語句刪除去。的確,這是可以的。但是,當除錯時加的printf語句比較多時,修改的工作量是很大的。用條件編譯,則不必一一刪改printf語句,只需刪除前面的一條“#define DEBUG”命令即可,這時所有的用DEBUG作識別符號的條件編譯段都使其中的printf語句不起作用,即起統一控制的作用,如同一個“開關”一樣。
    有時也採用下面的形式:
    #ifndef 識別符號
    程式段1
    #else
    程式段2
    #endif
    
    只是第一行與第一種形式不同:將“ifdef”改為“ifndef”。它的作用是:若識別符號未被定義則編譯程式段1,否則編譯程式段2。這種形式與第一種形式的作用相反。
    以上兩種形式用法差不多,根據需要任選一種,視方便而定。
    還有一種形式,就是#if後面的是一個表示式,而不是一個簡單的識別符號:
    #if 表示式
    程式段1
    #else
    程式段2
    #endif
    
    它的作用是:當指定的表示式值為真(非零)時就編譯程式段1,否則編譯程式段2。可以事先給定一定條件,使程式在不同的條件下執行不同的功能。