亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C預處理

2019-11-11 04:49:25
字體:
來源:轉載
供稿:網友

C的預處理,是在程序被編譯之前執行的,執行的操作有:將其他文件包含到正在被編譯的文件中來,定義符號常量(symbol constant)和宏(macro),程序代碼的條件編譯(conditional compilation)和有條件地執行預處理命令(conditional execution of PReprocessor directive)。預處理命令都是以#開頭,同一行中只有空格和注釋會出現在預處理命令之前。

include預處理命令

include預處理命令用于將指定文件的一個副本包含到該命令所在的位置上。有如下兩種形式:

#include <filename>#include "filename"

差別在于查找欲包含文件的起始位置不同。 用引號括起來,則預處理器從待編譯文件所在的目錄里開始查找欲包含的文件(當然也會在其他位置查找)。這種方法通常用來包含程序員定義的頭文件。 用尖括號括起來,則預處理器按照一種依賴于系統實現的方式,通常在預先指定的編譯器和系統目錄中開始查找。通常用來包含標準函數庫的頭文件。 被不同源程序所公用的聲明通常被編輯成一個頭文件,然后將其分別包含到各個源程序中。

define預處理命令

符號常量

#define命令的格式如下:

#define identifier replacement-text

在這一行出現之后,除了字符串文本外,其后出現的所有identifier(標識符)都會在程序編譯前被自動地替換成replacement-text(替換文本)。在符號常量(標識符)右邊的所有內容都會用來替換這個符號常量。例如:

#define PI = 3.1415

將會使程序中所有的PI都被“= 3.1415”所替換

宏也是預處理命令提供的一種標識符。與符號常量一樣,程序中所有的宏標識符(macro-identifier)也要在編譯前用其對應的替換文本來替換。宏的定義可以帶實參,也可以不帶。不帶實參的宏在處理上和符號常量沒有差別。對于帶實參的宏,實參將會被代入到替換文本中,這樣宏就被展開了(宏標識符和實參列表都被替換)。如下:

#define CIRCLE_AREA(x) ((PI)*(x)*(x))

此后凡是出現CIRCLE_AREA(y)的地方,y的值都會被代入到替換文本中x的位置,符號常量PI也會被它自己的值替換,然后宏就展開了。如:

area = CIRCLE_AREA(4);

被展開為:

area = ((3.1415)*(4)*(4));

當宏實參是一個表達式時,替換文本中將x括起來的圓括號可以保證計算順序的正確性。如:

area = CIRCLE_AREA(4 + c);

被展開為:

area = ((3.1415)*(4 + c)*(4 + c));

也可以將宏定義成一個函數,但是函數會帶來調用函數的開銷。宏的優點是直接將代碼插入到程序中,避免了調用函數的開銷,而且還使程序仍然保持良好的可讀性。而缺點是需要對其實參求兩次值。 宏有時被用來以內聯代碼替換一個函數,從而消除了函數調用的開銷,但是目前優化的編譯器常常會替代程序員將其內聯。 標準庫中函數有時也被定義成一個基于其他庫函數的宏。如:

#define getchar() getc(stdin)

一般在stdio.h中都存在。

宏或者符號常量的替換文本是在#define預處理命令這一行中位于標識符之后的所有文本。如果這一行剩余空間不夠寫下宏或者符號常量的替換文本,則必須要在行的末尾加上一個反斜杠(/),表示下一行繼續是替換文本。 符號常量和宏可以用#undef預處理命令來撤銷。該命令將撤銷符號常量和宏的定義,所以宏或者符號常量的作用域是從它們的定義開始到被它們#undef命令撤銷為止或者文件末尾為止。一旦被撤銷,宏名或者符號常量名可以用#define預處理命令來重新定義。

條件編譯

條件編譯使用戶能夠控制預處理命令的執行以及對程序代碼的編譯。每一個條件預處理命令都要計算一個整型表達式的值,但是強制類型轉換,sizeof表達式以及枚舉常量的值不能在預處理命令中計算。使用如下:

#if 0 code prevented from compiling#endif

將0改為1就可以讓上述部分代碼參與編譯。 條件預處理命令結構非常類似于if選擇語句,每個#if都使用#endif來結束。對于多分支的條件預處理結構,需要使用命令#elif(等價于if條件語句中的else if)和#else(等價于if條件語句中的else)。這些命令通常被用來防止頭文件被多次包含到同一個源文件中。 預處理命令#ifdef和#ifndef是#if defined(name)和#if !defined(name)的縮寫形式。使用如下:

#if !defined(MY_CONSTANT) #define MY_CONSTANT 0#endif

首先判斷MY_CONSTANT是否被定義。如果定義了,則表達式defined(MY_CONSTANT)的值為1,否則為0,定義MY_CONSTANT為0。 條件編譯一般用于程序調試,如果沒有調試器,一般使用printf命令打印變量的值以驗證控制的流向。對于這樣的printf可以用條件預處理命令封裝起來以便使其僅在程序調試過程中參加編譯。如下:

#ifdef DEBUG printf("Variable x = %d/n", x);#endif

只有在該命令之前定義了符號常量DEBUG,上面的printf才會參加編譯。

#error和#pragma

#error tokens

預處理命令#error打印出包含命令中指定tokens(標記)的信息,信息的具體內容和系統的實現有關。標記是用空格分隔的一個字符序列。使用如下:

#error 1 - Out of range error

包含了6個標記,某些系統執行該條指令時,命令中的標記將被作為出錯信息顯示出來,然后終止預處理,并停止程序編譯。

#pragma tokens

執行一個系統實現中已經定義好了的操作,不能被系統識別出來的將被忽略掉。

#和##運算符

#和##運算符僅在標準C中有效。#將替換文本中的標記轉換成一個用引號引起來的字符串。#必須用在一個帶有實參的宏當中,因為#的操作數就是宏的實參。使用如下:

#define HELLO(x) printf("Hello, " #x "/n");

當程序中出現了HELLO(John),將被替換成:

printf("Hello, John/n");

##用于將兩個標記拼接在一起。使用如下:

#define TOKENCONCAT(x, y) x ## y

若程序中出現TOKENCONCAT(O,K),將會被OK替換。##操作符必須要有兩個操作數。

行號

#line使在它之后的后繼程序代碼行,按照命令中給定的整型常數值,重新編排序號。如:

#line 100

使下一行程序代碼的行號從100開始。同時,#line命令中還可以包含文件名,如下:

#line 100 "file1.c"

表示從下一行程序代碼開始 ,后繼代碼行的行號從100開始編號。同時,任何編譯器消息采用的文件名都是file1.c。該命令有助于讓語法錯誤和編譯器警告產生的信息更好理解。這些符號并不出先在源程序文件中。

預定義的符號常量

以下標識符和defined標識符(判斷是否標識符定義過)都不可用于#define和#undef命令。

_LINE_ 源程序文件中當前代碼行號(整型常量)_FILE_ 假定的源文件名(一個字符串)_DATE_ 編譯源文件的日期(如“Jan 19 2002”)_TIME_ 編譯源文件的時間(格式為“時 分 秒”的字符串文本)_STDC_ 如果編譯器支持標準C,則值為1

斷言

宏assert在頭文件assert.h中定義,用于測試一個表達式的值,如果表達式為假(0),則assert打印出錯信息,并調用函數abort(stdlib.h中定義)來結束程序執行。是一個用于測試變量的值是否正確的的調試工具。使用如下:

assert(x <= 10);

若x大于10,則包含有行號和文件名的出錯信息就會被打印出來,然后程序終止。 如果定義了符號常量NDEBUG,則其后所有的斷言都將被忽略掉。若想忽略斷言,只需在程序開始時插入一行:

#define NDEBUG
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美xxxx做受欧美.88| 精品一区电影国产| 国产亚洲欧洲高清| 国产区亚洲区欧美区| 国产美女扒开尿口久久久| 国产午夜精品一区二区三区| 美女999久久久精品视频| 亚洲女成人图区| 精品无人区乱码1区2区3区在线| 麻豆精品精华液| 国产欧美精品一区二区三区介绍| 色青青草原桃花久久综合| 成人性生交大片免费看视频直播| 亚洲欧美一区二区三区久久| 亚洲第一天堂无码专区| 日韩欧美一区二区三区久久| 黄色成人在线播放| 欧美日韩性视频| 精品国产91久久久久久| 欧美国产日韩免费| 亚洲国产精品国自产拍av秋霞| 国产精品三级美女白浆呻吟| 亚洲精品mp4| 欧美网站在线观看| 色婷婷综合成人| 欧美多人爱爱视频网站| 人体精品一二三区| 久久久久久久久久婷婷| 国产一区二区丝袜高跟鞋图片| 色综合天天综合网国产成人网| 国产精品18久久久久久首页狼| 精品偷拍各种wc美女嘘嘘| 亚洲综合中文字幕在线观看| 欧美—级a级欧美特级ar全黄| 亚洲第一免费网站| 欧美国产亚洲视频| xxxxxxxxx欧美| 亚洲欧美国产精品va在线观看| 亚洲精品综合精品自拍| 久久精品国产综合| 欧美中文字幕视频| 欧美亚洲国产成人精品| 国产成人精品av在线| 欧美日韩精品国产| 色综合久久久久久中文网| 这里只有精品视频| 狠狠躁18三区二区一区| 日韩黄色在线免费观看| 亚洲老司机av| 日韩欧中文字幕| 久久中文精品视频| 色综合91久久精品中文字幕| 国产91露脸中文字幕在线| 97成人在线视频| 国产精品羞羞答答| 久久97久久97精品免视看| 国内自拍欧美激情| 日韩国产高清污视频在线观看| 欧美日韩在线视频一区二区| 国产精品永久免费观看| 国产视频丨精品|在线观看| 国产在线不卡精品| 精品动漫一区二区三区| 国产精品久久久久久久久粉嫩av| 亚洲国产成人久久综合一区| 日韩精品在线播放| 精品国内自产拍在线观看| 青青草成人在线| 国产99视频在线观看| 欧美午夜精品久久久久久人妖| 欧美视频在线免费看| 日韩视频永久免费观看| 久久久久成人精品| 亚洲国产欧美精品| 中文字幕日韩在线视频| 自拍偷拍亚洲在线| 国产精品一香蕉国产线看观看| 国产精品日韩在线一区| 日韩中文字幕在线免费观看| 视频在线观看99| 久久久免费在线观看| 国产91精品不卡视频| 乱亲女秽乱长久久久| 久久久久久久久91| 欧美专区在线播放| 亚洲精品福利在线| 精品香蕉一区二区三区| 国产精品av免费在线观看| 成人激情免费在线| 国产精品国产三级国产aⅴ9色| 国产精品视频区1| 欧美一区二区三区免费视| 欧美精品成人91久久久久久久| 在线免费观看羞羞视频一区二区| 国产精品美女在线| 成人福利网站在线观看11| 亚洲成人久久电影| 色综合男人天堂| 91亚洲va在线va天堂va国| 亚洲一区精品电影| 夜夜嗨av一区二区三区四区| 国产精品香蕉在线观看| 96sao精品视频在线观看| 日本久久中文字幕| 美女福利视频一区| 亚洲人成电影在线观看天堂色| 国产视频精品免费播放| 原创国产精品91| 日韩欧美有码在线| 久久天堂av综合合色| 97色伦亚洲国产| 亚洲欧洲日产国产网站| 色综合伊人色综合网| 久久99久久99精品中文字幕| 日韩在线欧美在线| 国产高清在线不卡| 欧美精品久久久久a| 国产精品高清免费在线观看| 国产午夜精品一区理论片飘花| 欧美日韩一二三四五区| 亚洲欧美精品伊人久久| 美乳少妇欧美精品| 国产亚洲人成a一在线v站| 亚洲福利视频免费观看| 国产欧亚日韩视频| 美女黄色丝袜一区| 中文字幕精品久久久久| 国产一区二区日韩精品欧美精品| 日韩有码在线电影| 日本19禁啪啪免费观看www| 久久视频国产精品免费视频在线| 日韩中文字幕不卡视频| 亚洲午夜性刺激影院| 国产精品一区二区三区毛片淫片| 超碰91人人草人人干| 日韩中文字幕不卡视频| 在线视频中文亚洲| 九九精品在线视频| 国产精品成人免费视频| 亚洲精品第一国产综合精品| 日韩av成人在线| 91精品视频专区| 久久综合五月天| 国产精品久久久久aaaa九色| 国产在线观看精品| 亚洲欧美中文日韩在线| 亚洲国产成人一区| 亚洲**2019国产| 欧美视频中文字幕在线| 国产欧美日韩中文字幕在线| 欧美午夜久久久| 国产一区二区三区久久精品| 久久精品这里热有精品| 国产午夜精品美女视频明星a级| 青青久久av北条麻妃海外网| 亚洲精品一区久久久久久| 91成品人片a无限观看| 精品调教chinesegay| 欧美性xxxxxx| 日韩电影中文字幕| 成人做爽爽免费视频| 欧美精品videofree1080p| 日韩电影大全免费观看2023年上| 性亚洲最疯狂xxxx高清|