c語言中有4類預處理命令: 檔案包含命令,巨集定義命令,條件編譯命令,編譯控制命令。
檔案包含命令:
#include /*系統路徑中查詢檔案*/
#include "hello.h" /*系統和使用者當前路徑中查詢檔案*/
巨集定義命令:
#define 巨集名稱 /* 不帶引數巨集定義 */
#define 巨集名稱 字串 /* 不帶引數巨集定義 */
#define 巨集名稱(參數列) 字串 /* 帶引數巨集定義 */
#undef 巨集名稱 /* 取消巨集定義 */
條件編譯命令:
#if 條件語句 /* 如果給定條件為真,則編譯下面** */
#ifdef 巨集名稱 /* 如果巨集已經定義,則編譯下面** */
#ifndef 巨集名稱 /* 如果巨集沒有定義,則編譯下面** */
#else /* 如果前#if條件不為真,則編譯下面** */
#elif 條件語句 /* 如果前#if條件不為真,當前條件為真,則編譯下面**,其實就是else if的簡寫 */
#endif /* 結束乙個#if……#else條件編譯塊 */
編譯控制命令:
#error [字串] /* 停止編譯並顯示錯誤資訊 */
#warning [字串] /* 用於生成編譯警告,但不會停止編譯 */
#line number newfilename /* 初始化行計數器 newfilename可省略 */
#pragma /* 指令沒有正式的定義。編譯器可以自定義其用途。用於指示編譯器完成一些特定的動作 */
主要目的是用來簡化程式,將函式宣告,巨集定義,結構體定義等定義相關的**放在頭.h的標頭檔案中,這樣可以在多處使用#include來包含這些定義,而不用再次宣告和定義。(當然你也可以不用.h的檔案,比如#include 「hello.txt」 也是不會出錯的,但這並不規範)
巨集主要的目的是為了減少不一致性和便於修改,巨集在預處理時進行巨集替換。巨集的幾個注意事項:
巨集沒有資料型別問題,它的引數沒有型別,也不會進行型別檢查;
巨集可以巢狀使用;
「」字串中不會包含巨集;
巨集名稱一般用大寫;
巨集可以通過續行號「\」來寫成多行;
幾個特殊的巨集(即內建巨集):
__file__ 當前程式檔名的字串
__line__ 當前行號的整數
__date__ 當前日期的字串
__time__ 當前時間的字串
__stdc__ 如果編譯器遵循ansi c標準,它就是個非零值
__function__ 當前函式名的字串,它是非標準的
__cplusplus 當編寫c++程式時該識別符號被定義
巨集定義中#和##的使用方法:
#define str(str) #str /* #用於把巨集定義中的引數兩端加上字串的"" */
str(hello!) 相當於 「hello!」
#define wide(addr) addr##0000 /* ##用來連線引數 */
wide(0x6666) 相當於 0x66660000
通過巨集或條件語句來控制那些**編譯,還可以簡單判斷編譯器。
條件編譯的幾種型別:
/******** 形式1 ********/
#ifdef 巨集名
/* 語句段 */
#endif
/******** 形式2 ********/
#ifndef 巨集名
/* 語句段 */
#endif
/******** 形式3 ********/
#if 表示式
/* 語句段 */
#endif
/******** 形式4 ********/
#if 表示式
/* 語句段1 */
#else
/* 語句段2 */
#endif
/******** 形式5 ********/
#if 表示式1
/* 語句段1 */
#elif 表示式2
/* 語句段2 */
#else
/* 語句段3 */
#endif
乙個測試用例:
#error命令用於當**編譯時進入了不該編譯的分子則停止編譯。
乙個用例:
/*
*檢查編譯此原始檔的編譯器是不是c++編譯器
*如果使用的是c編譯器則執行#error命令
*如果使用的是c++編譯器則跳過#error命令
*/#ifndef __cplusplus
#error 您當前使用的不是c++編譯器噢!
#endif
#include int main()
#line 用於強制指定新的行號和編譯檔名,並對源程式的**重新編號,其本質是重定義__line__和__file__。
測試用例:
#include #line 1 "mycode.c"
int main()
執行結果:
mycode.c:4
test.c:1
#pragma 用於指示編譯器完成一些特定的動作,所定義的很多指示字是編譯器特有的,在不同的編譯器間是不可移植的。
#pragma message——用於自定義編譯訊息;
#pragma once——用於保證標頭檔案只被編譯一次;
#pragma pack——用於指定記憶體對齊方式;
C C 預處理命令
1.和 和 操作符是和 define 巨集使用的。使用 使在 後的首個引數返回為乙個帶引號的字串 例如 defineto string s s defineconcatenate x,y x y 2.define 命令用於把指定字串替換檔案中的巨集名稱 3.error 可以簡單的使編譯器在發生錯誤時...
C C中的預處理命令
分析 預編譯又稱為預處理 是做些 文字的替換工作。處理 開頭的指令 比如拷貝 include包含的檔案 define 巨集定義的替換 條件編譯等,就是為編譯做的預備工作的階段,主要處理 開始的預編譯指令,預編譯指令指示了在程式正式編譯前就由編譯器進行的操作,可以放在程式中的任何位置。c c 編譯系統...
c c 的預處理
c c 的預處理定義 一。stringizing operator 在c和c 中數字標誌符 被賦予了新的意義,即字串化操作符。其作用是 將巨集定義中的傳入引數名轉換成用一對雙引號括起來 引數名字串。其只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前。如 define example ...