C 預處理指令

2021-07-24 08:36:30 字數 1909 閱讀 4984

巨集定義指令定義了乙個識別符號(巨集名)及乙個字串, 在源程式中每次遇到該識別符號時, 均以定義的字串替換它(巨集替換)

巨集名和引數間不能有空格, 識別符號和字串間可有任意空格

字串中應習慣對巨集引數加上括號, 這樣使用巨集時, 如果實參是表示式,則不易出錯

巨集替換只作巨集名和引數替換,不做計算,不做表示式求解

巨集一旦被定義後, 其巨集名即可成為其它巨集定義的一部分

一條巨集定義只能寫在一行, 可以使用續行符

巨集替換在編譯前進行,不分配記憶體, 只占用編譯時間, 速度快, 增加**長度, 可以設法得到多個值, 巨集引數替換不存在型別,也沒有型別轉換

函式呼叫在程式執行時進行,並分配記憶體, 占用執行時間, 具有呼叫時開銷(分配記憶體, 保留現場, 值傳遞, 返回值), 只有乙個返回值, 存在引數的啞實結合

操作符和巨集引數之間可以有任意數量的空格,而不會被當作字串的一部分

操作符含義

#stringizing 字串化操作符

#token-pasting 符號連線操作符

@#charizing 字元化操作符

檔案包含指令使編譯器將指定的檔案嵌入原始檔中執行該指令的位置

檔案包含指令可以巢狀使用, 稱為巢狀的嵌入檔案, 巢狀層次依賴於具體實現

被嵌入的檔名必須用雙引號或尖括號括起來, 檔案檢索方式不同

編譯指示指令對每個編譯器給出了乙個方法, 在保持與c和c++完全相容的情況下, 給出主機專有特徵

編譯指示是機器或作業系統專有的,且對於每個編譯器都是不同的

編譯指示可以設定編譯器的狀態或指示編譯器完成一些特定的動作

message 引數能夠在編譯資訊輸出視窗中輸出相應的資訊, 可用於輸出控制**版本的巨集

code_seg 引數能夠指定函式在目標檔案中存放的節, 可用於開發驅動程式

once 引數能夠保證標頭檔案只被編譯一次, 新增到頭檔案起始位置即可

hdrstop 引數表示預編譯標頭檔案結束位置, bcb可以預編譯標頭檔案以加快鏈結的速度,但如果所有標頭檔案都進行預編譯又可能占太多磁碟空間, 所以使用這個選項排除一些標頭檔案

startup 引數指定編譯優先順序, 用於檔案之間存在依賴關係的情況, 如果使用了#pragma package(smart_init), bcb就會根據優先順序先後編譯

warning 引數允許有選擇性的修改編譯器的警告訊息行為, 可以使用push和pop儲存和彈出警告狀態或使用識別符號(once, default, n, disable, error)處理指定序號的警告訊息

comment 引數將乙個注釋記錄放入乙個物件檔案或可執行檔案中

pack 引數指定物件的對齊寬度

always_inline

no_aliass

編譯出錯指令強迫編譯程式停止編譯,主要用於程式除錯, 在程式崩潰之前能夠給出一定的資訊

編譯出錯指令使預處理器發出一條錯誤訊息,該訊息包含指令中的文字

條件編譯指令可對程式源**的各部分有選擇地進行編譯, 該過程稱為條件編譯

商業軟體使用條件編譯提供和維護某一程式的許多顧客版本

#if指令後面的表示式在編譯時求值, 因此必須是常量, 且不允許含有sizeof操作符, 雖然sizeof是編譯時求值

在巢狀的條件編譯中, #endif, #else 或 #elif 與最近 #if 或 #elif 匹配

#if defined() 相當於 #ifdef

#if !defined() 相當於 #ifndef

defined 應用範圍更大,可以支援多個預編譯變數的檢查

#if ( !defined(_debug) && defined(use_mylib) )

......

#endif

主要用於除錯及其它特殊應用

關於#pragma code_seg

#pragma詳細解釋

C 預處理指令

1.define 通常和 if一起使用 使用 define可以定義乙個符號,並通過將該符號用作表示式傳遞給 if 指令,使該表示式的計算結果為true 比如 preprocessor if.cs define debug define vc v7 using system public class ...

C預處理指令

一 預處理的由來 在c 的歷史發展中,有很多的語言特徵 特別是語言的晦澀之處 來自於c語言,預處理就是其中的乙個。c 從c語言那裡把c語言預處理器繼承過來 c語言預處理器,被bjarne博士簡稱為cpp,不知道是不是c program preprocessor的簡稱 二 常見的預處理功能 預處理器的...

c 預處理指令

c 的預處理器指令很容易識別,你看到了 就能認出它們。它和其他的命令有什麼區別呢?區別在於這些命令從來不會轉化為可執行 的命令,但是會影響編譯過程的各個方面。它用來做什麼呢?當計畫發布兩個版本的 的時候。即基本版和擁有更多版本的企業版,就可以用到預處理器指令。在編譯基本版的時候,使用預處理指令會禁止...