1 4 C C 的預處理命令

2021-09-08 20:01:52 字數 2951 閱讀 1430

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 ...