預定義知識
------------------------寫於2023年12月26日
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)
該指令不終止編譯,直接把乙個字串文字送到標準輸出。
預定義知識
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...
預定義,巨集定義
巨集定義 其作用就是 換其名曰 給程式中的一段特殊的 函式,資料取了個簡單明瞭的名字。不過有一點這傢伙的作用範圍是全域性的。即使它是在某乙個函式塊中定義的。這個其實也容易理解。因為巨集定義是預定義的一種,在我們的程式之前,由預編譯器 cpp 提前編譯出來了,那個時候程式裡的結構是個啥樣子編譯器壓根就...
預定義變數
不包含副檔名的目標檔名稱。所有的依賴檔案,以空格分開,並以出現的先後為序,可能包含重複的依賴檔案。第乙個依賴檔案的名稱。所有的依賴檔案,以空格分開,這些依賴檔案的修改日期比目標的建立日期晚。目標的完整名稱。所有的依賴檔案,以空格分開,不包含重複的依賴檔案。如果目標是歸檔成員,則該 變數表示目標的歸檔...