1.巨集指令:
#define #error #import #undef #elif #if #include #else #ifdef #line #endif #ifndef #pragma


2. #define
#define WIDTH 80
#define LENGTH (WIDTH+10)
#define test(f1,f2) (f1*f2)


3. #error
#error語言符號字符串
採用error指令可產生編譯錯誤信息


#if !defined(NUM_TEN)
#error ten is not defined.
#endif
當遇到#error指令時,編譯終止


3.#if,#elif,#else和#endif
#if、#elif、#else和#endif指令控制原始碼中某部分的編譯。
原始碼中每個#if指令都必須與最近的一個#endif相匹配。
在#if和#endif指令之前的#elif指令的數目是不限的,但最多只能有一個#else指令。
#else必須是#endif之前的最後一個指令。
 
#if常量表達式
……………
#elif常量表達式
…………………
#else
……………………
#endif


表達式必須是整型且可以包括整型常量,字符常量和defined操作符。
預處理器操作符defined可用於特殊的常量表達式
defined(標識符)
defined標識符
若此標識符當前已定義,則該常量表達式被認為是真(非0);否則,條件為假(0), defined指令只能用於#if和#endif指令。


#if defined (CREDIT)
     credit();
#elif defined(DEBIT)
     debit();
#else
     printerror();
#endif
 
 
 
 
#if DLEVEL > 5
#define SIGNAL 1
         #if STACKUSE == 1
  #define STACK 200
#else
  #define STACK 100
         #endif
#else
         #define SIGNAL 0
#if STACKUSE==1
#define STACK 100
#else
#define STACK 50
         #endif
#endif
 
 
 
#if DLEVEL==0
  #define STACK 0
#elif DLEVEL==1
#define STACK 100
#elif DLEVEL > 5
display(debugptr);
#else
#define STACK 200
#else
#define STACK 200
#endif
 
 
#if _BEEP_DISP_
if(d_dpbeep == 1)
    dp_kycodechgreq1() ;
else if(d_dpbeep == 2)
    dp_kycodechgreq2() ;
d_dpbeep = 0 ;
#endif


在標頭檔定義的時候,一般定義如下,防止文件重名:
//文件名為EXAMPLE.H
#if !defined(EXAMPLE_H)
#define ExampleE_H
class Example
{
...
};
#endif
//!defined(EXAMPLE_H)


4. #ifdef和ifndef指令


#ifdef標識符
#ifndef標識符
等同於
#if defined標識符
#if !defined標識符


當標識符已被定義時,#ifdef標識符語句等同於#if 1;而當標識符未定義或用#undef指令對其反定義時,該語句等同於#if 0。


#ifndef指令測試與#ifdef相反的條件。若標識符未定義(或已用#undef反定義),其條件為真(非0);反之,條件為假(0)。
#ifndef TEST
#define FIANL
#endif


5. #include
你可以把常量和巨集定義放在包含文件中,然後用#include指令把這些定義加到任何原始碼中。
包含文件對於外部變量和復雜數據類型結合的說明也是有用的。有引號和尖號兩種,意義不同:
"   " 引號格式這種格式指示預處理器先在包含#include語句的文件的相同目錄內搜索,然後在任何包括該文件的目錄中搜索。
 隨後預處理器沿著/I編譯器選項指定的路徑搜索,最後是在INCLUDE環境變量說明的路徑搜索
<   > 尖括號格式這種格式指示預處理器首先在/I編譯器選項指定的路徑中搜索包含文件。然後在INCLUDE環境變量說明的路徑中搜索


6. #line指令
#line指令告訴預處理器將編譯器內部存儲的行號和文件名轉變為一個給定的行號和文件名。 。
編譯器使用該行號和文件名指出編譯過程中發現的錯誤。行號一般指的是當前輸入行,文件名指當前輸入文件。
每處理一行,行號就增1,你可以通過編寫一個#line指令來改動原始碼行號和文件名


#line
數字序列“文件名”
數字序列的值可以是任何整型常數。
文件名可以是任意字符的組合,且應括在雙引號(“”)間
#line 151 "copy.c"


7. #undef
#undef指令取消(反定義)一個原來由#define指令創建的名稱。
#define WIDTH 80

。 。
。 。
。 。
。 。
#undef WIDTH



8.預定義的巨集
_DATE_ 當前原始碼的編譯日期
_FILE_ 當前原始碼名稱。
_LINE_ 當前原始碼的行號
_TIME_ 當前文件的最近編譯時間。該時間是格式為hh:mm:ss的字符串文字
_TIMESTAMP_當前原始碼的最近修改日期。日期是格式為Ddd Mmm Datehh:mm:ss yyyy的字符串文字,這裡Ddd是星期幾的簡寫,Date是從1到31的一個整數


Microsoft特殊預定義的巨集:
__cplusplus 僅為C++程序定義
__CPPRTTI 定義為用/GR編譯的代碼(允許運行時類型信息)
__CPPUNWIND 定義為用/GX編譯的代碼(允許異常處理)
__MSC_VER 定義編譯器版本,對於Microsoft Visual C++ 6.0定義為1200,它總是定義的
__WIN32  為Win32應用程序而定義。



9.其他
#pragma warning( disable : 4507 34 ) //禁止警告消息4507和34
#pragma comment(lib,"ddraw.lib ")
#pragma message(messagestring)
該指令不終止編譯,直接把一個字符串文字送到標準輸出。

arrow
arrow
    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()