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

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

C預處理

2019-11-11 05:24:06
字體:
來源:轉載
供稿:網友

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
亚洲2020天天堂在线观看| 福利精品视频在线| 亚洲xxxx在线| 欧美日韩性视频| 亚洲福利在线观看| 成人h视频在线| www.99久久热国产日韩欧美.com| 黄色一区二区在线| 欧美午夜片欧美片在线观看| 欧洲美女7788成人免费视频| 国产精品国产亚洲伊人久久| 中文字幕精品—区二区| 国产亚洲欧洲黄色| 日韩成人在线网站| 国产成人精品日本亚洲专区61| 91av在线免费观看| 国产精品一区二区久久久| 日韩av免费观影| 国产成人一区二| 欧美大人香蕉在线| 久久激情视频免费观看| 国产成人精品最新| xxav国产精品美女主播| 亚洲精品xxxx| 成人在线免费观看视视频| 日韩av片电影专区| 亚洲美女视频网站| 中文字幕亚洲欧美日韩高清| 欧美日韩国产123| 日韩激情第一页| 亚洲三级黄色在线观看| 亚洲国产欧美一区二区丝袜黑人| 国产美女高潮久久白浆| 国产日韩欧美在线视频观看| 欧美理论电影网| 国产大片精品免费永久看nba| 欧美中文字幕视频在线观看| 久久久久久国产精品美女| 亚洲男人天堂九九视频| 九九久久久久99精品| 黑丝美女久久久| 国产精品成久久久久三级| 91po在线观看91精品国产性色| 国产精品久久一| 欧美一级淫片丝袜脚交| 精品爽片免费看久久| 欧美性xxxxx极品| 亚洲成成品网站| 久久深夜福利免费观看| 91色视频在线观看| 欧美精品少妇videofree| 青青草一区二区| 欧美性猛交xxxx| 国产精品国产自产拍高清av水多| 国产在线高清精品| 韩国精品美女www爽爽爽视频| 亚洲嫩模很污视频| 亚洲电影成人av99爱色| 亚洲综合av影视| 国产精品久久久久一区二区| 91av视频在线免费观看| 国产美女精彩久久| 国产综合在线视频| 成人中文字幕在线观看| 狠狠躁夜夜躁人人爽天天天天97| 91超碰caoporn97人人| 欧美极品少妇xxxxⅹ免费视频| 国产精品久久久久影院日本| 久久天天躁狠狠躁夜夜爽蜜月| 精品国产欧美一区二区三区成人| 亚洲国产精品va在线| 日本高清不卡在线| 日韩av片免费在线观看| 欧美又大又硬又粗bbbbb| 成人免费在线视频网址| 久久久欧美一区二区| 狠狠色狠狠色综合日日五| 亚洲高清免费观看高清完整版| 国产美女久久精品| 欧美激情免费观看| 亚洲bt欧美bt日本bt| 久久免费精品日本久久中文字幕| 日韩一区二区三区国产| 亚洲精品久久在线| 中文字幕精品www乱入免费视频| 国产精品美女无圣光视频| 亚洲色图激情小说| 欧美裸体xxxx极品少妇软件| 亚洲精品资源在线| 成人午夜在线观看| 亚洲黄在线观看| 91夜夜揉人人捏人人添红杏| 97视频在线观看播放| 国产精品永久免费观看| 在线观看日韩av| 色久欧美在线视频观看| 亚洲丝袜av一区| 欧美精品videosex极品1| 精品国内自产拍在线观看| 在线视频精品一| 成人精品一区二区三区电影免费| 日韩av免费看网站| 高跟丝袜欧美一区| 91九色在线视频| 精品久久久久国产| 国产精品三级美女白浆呻吟| 欧美成人精品一区| 91经典在线视频| 精品久久中文字幕久久av| 久久人人爽人人爽人人片av高请| 国产精品久久久久久久久久尿| 国产脚交av在线一区二区| 久久99视频精品| 欧美日韩亚洲精品一区二区三区| 亚洲精品乱码久久久久久金桔影视| 国产综合久久久久| 国产精品美女视频网站| 欧美成人中文字幕| 久久久电影免费观看完整版| 成人免费网视频| 成人妇女免费播放久久久| 欧美在线性爱视频| 91香蕉嫩草影院入口| www日韩中文字幕在线看| 色小说视频一区| 亚洲国产精品va在线观看黑人| 黑人狂躁日本妞一区二区三区| 亚洲美女精品成人在线视频| 奇门遁甲1982国语版免费观看高清| 欧美大成色www永久网站婷| 欧美精品在线网站| 国内精品小视频| 中文字幕亚洲无线码a| 久久免费福利视频| 亚洲人成欧美中文字幕| 欧美高清性猛交| 欧美日韩在线第一页| 国内久久久精品| 亚洲天堂第二页| 欧美高清不卡在线| 色爱av美腿丝袜综合粉嫩av| 中文字幕在线看视频国产欧美| 91情侣偷在线精品国产| 欧美一区二区色| 日韩一区二区三区xxxx| 亚洲视屏在线播放| 亚洲影视九九影院在线观看| 日本一欧美一欧美一亚洲视频| 欧美在线日韩在线| 欧美一级淫片丝袜脚交| 国产精品青青在线观看爽香蕉| 亚洲天堂av电影| 国产日韩精品在线观看| 在线看国产精品| 2019国产精品自在线拍国产不卡| 欧美一区三区三区高中清蜜桃| 热99精品只有里视频精品| 精品福利视频导航| 国产在线观看精品| 欧洲精品毛片网站| 亚洲香蕉伊综合在人在线视看| 国产精品视频最多的网站| 日韩中文字幕久久| 激情av一区二区|