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

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

C預處理

2019-11-11 05:22:36
字體:
來源:轉載
供稿:網友

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
上一篇:static關鍵字

下一篇:google的gflag的使用

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91亚洲国产成人久久精品网站| 色哟哟入口国产精品| 亚洲电影天堂av| 日韩精品视频在线观看网址| 久久久久久久国产精品视频| 国产91成人video| 麻豆国产va免费精品高清在线| 日本亚洲精品在线观看| 欧美日韩在线免费| 色777狠狠综合秋免鲁丝| 久久久久久午夜| 欧美富婆性猛交| 国产精品嫩草视频| 国产成人+综合亚洲+天堂| 97色在线视频| 久久99国产精品自在自在app| 91精品国产高清自在线看超| 中文字幕精品国产| 欧美另类69精品久久久久9999| 亚洲www永久成人夜色| 亚洲高清av在线| 色av中文字幕一区| 日韩av电影在线播放| 色偷偷av一区二区三区| 久久人体大胆视频| 亚洲欧美激情在线视频| 国产精品亚洲一区二区三区| 欧美寡妇偷汉性猛交| 国产精品va在线播放我和闺蜜| 欧美日本黄视频| 热久久这里只有精品| 日韩最新中文字幕电影免费看| 亚洲社区在线观看| 欧美激情中文字幕在线| 久久精品国产久精国产一老狼| 欧美插天视频在线播放| xvideos成人免费中文版| 欧美乱大交做爰xxxⅹ性3| 久久91精品国产91久久久| 国产97在线|亚洲| 中文字幕亚洲欧美日韩在线不卡| 成人福利网站在线观看| 美女av一区二区三区| 精品无人区太爽高潮在线播放| 国产成人精品电影| 91精品中文在线| 91精品久久久久久| 色www亚洲国产张柏芝| 成人免费激情视频| 成人黄色午夜影院| 亚洲人线精品午夜| 国产精品91久久久久久| 欧美在线视频观看| 欧美激情一二三| 26uuu国产精品视频| 久久香蕉精品香蕉| 成人高清视频观看www| 91久久在线视频| 国产精品av在线播放| 人人做人人澡人人爽欧美| 成人激情春色网| 欧美尺度大的性做爰视频| 隔壁老王国产在线精品| 97国产suv精品一区二区62| 国产精品国内视频| 日韩精品免费在线视频| 久久91亚洲精品中文字幕| 国产日韩在线亚洲字幕中文| 色偷偷av一区二区三区| 亚洲天堂一区二区三区| 国内精久久久久久久久久人| 日韩色av导航| 色哟哟网站入口亚洲精品| 亚州国产精品久久久| 久久久成人的性感天堂| 成人性生交大片免费看视频直播| 亚洲性av在线| 国产亚洲综合久久| 国产在线精品一区免费香蕉| 国产在线视频一区| 欧美日韩爱爱视频| 亚洲网站在线看| 欧美激情va永久在线播放| 亚洲少妇中文在线| 国产成人午夜视频网址| 欧美成人精品在线视频| 欧美精品一区二区免费| 久久久久久成人精品| 国产精品精品视频一区二区三区| 日韩激情片免费| 久久久精品一区二区| 欧美性猛交xxxx黑人| 精品一区二区电影| 日韩精品www| 在线视频欧美日韩| 在线观看视频亚洲| 日韩经典中文字幕在线观看| 九九热这里只有精品6| 久久免费观看视频| 欧美特黄级在线| 欧美日韩国产一区二区| 欧美极品少妇xxxxⅹ喷水| 成人国产在线视频| 久久99精品久久久久久琪琪| 亚洲大胆美女视频| 久久人人爽国产| 久久99青青精品免费观看| 国产自产女人91一区在线观看| 精品国产一区二区三区久久久狼| 精品久久久久久久久久久久久| 国产精品第一区| 国产精品欧美日韩一区二区| 欧美日韩免费观看中文| 热99精品只有里视频精品| 久久午夜a级毛片| 欧美日韩成人免费| 欧美日韩亚洲天堂| 亚洲视频在线观看| 九九热在线精品视频| 一区二区欧美亚洲| 亚洲国产精彩中文乱码av在线播放| 国产91色在线|| 91久久久国产精品| 久久九九免费视频| 成人黄色免费看| 亚洲成人a**站| 2019中文字幕在线| 国产91精品久| 色偷偷亚洲男人天堂| 高清日韩电视剧大全免费播放在线观看| 97色在线观看| 日本精品视频在线播放| 亚洲丝袜在线视频| 亚洲精品午夜精品| 国产精品久久久久久久久免费看| 亚洲一区二区三区香蕉| 色综合久久悠悠| 国产精品自产拍在线观看| 精品国产依人香蕉在线精品| 久久777国产线看观看精品| 亚洲电影免费观看高清完整版在线观看| 亚洲第一精品自拍| 一区二区三区精品99久久| 1769国产精品| 欧美日韩亚洲国产一区| 亚洲国产精品va| 欧美一级淫片丝袜脚交| 亚洲精品成人久久电影| 成人激情视频小说免费下载| 91情侣偷在线精品国产| 中文字幕亚洲无线码在线一区| 亚洲精品久久久久久久久| 欧美色播在线播放| 色综合视频网站| 国产精品久久国产精品99gif| 国产精品第一页在线| 欧美成人精品在线观看| 亚洲精品自在久久| 青草青草久热精品视频在线网站| 国产成人高清激情视频在线观看| 欧美一区二区影院| 另类美女黄大片| 国产精品aaaa| 精品视频9999|