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

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

C預處理

2019-11-11 06:49:37
字體:
來源:轉載
供稿:網友

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
国产精品吴梦梦| 国产精品ⅴa在线观看h| 日韩精品极品在线观看| 国产精品中文字幕在线| 成人a级免费视频| 欧洲成人在线视频| 91日本视频在线| 免费成人高清视频| 欧美国产精品人人做人人爱| 国产女人18毛片水18精品| 97欧美精品一区二区三区| 69久久夜色精品国产69乱青草| 国模吧一区二区三区| 91av视频在线免费观看| 日韩av一区在线| 欧美日韩一区免费| 欧美二区乱c黑人| 成人免费视频xnxx.com| 91超碰caoporn97人人| 91精品国产色综合久久不卡98| 欧美最猛性xxxxx亚洲精品| 欧美日韩国产中字| 久久精品在线视频| 国产成人一区二区三区| 午夜精品久久久久久久99黑人| 国产欧美精品日韩| 国产精品成人观看视频国产奇米| 最近的2019中文字幕免费一页| 国产精品视频内| 国产日韩欧美夫妻视频在线观看| www.欧美视频| 欧美人交a欧美精品| 国产日韩综合一区二区性色av| 国产精品视频999| 欧美国产日韩一区二区| 98精品在线视频| 日本亚洲欧美成人| 色一区av在线| 亚洲精品之草原avav久久| 精品色蜜蜜精品视频在线观看| 中文字幕日韩在线视频| 亚洲片av在线| 日本高清不卡在线| 久久精品99无色码中文字幕| 6080yy精品一区二区三区| 最新日韩中文字幕| 国产中文欧美精品| 国产精品人人做人人爽| 成人网在线观看| 久久久久亚洲精品国产| 日韩精品视频在线播放| 国产一区二区三区视频在线观看| 久久伊人91精品综合网站| 亚洲精品国产美女| 欧美专区第一页| 久久69精品久久久久久国产越南| 伊人男人综合视频网| 欧美日韩国产专区| 精品国偷自产在线视频99| 91精品国产成人www| 久久视频中文字幕| 亚洲精品99999| 国产成人亚洲综合青青| 69视频在线免费观看| 免费av在线一区| 欧美极品少妇xxxxⅹ免费视频| 国产日韩在线视频| 92国产精品视频| 91亚洲国产成人精品性色| 色悠悠国产精品| 日韩美女免费视频| 国产亚洲视频在线观看| 草民午夜欧美限制a级福利片| 国产欧美在线视频| 日韩av在线一区| 日韩av观看网址| 国产在线视频2019最新视频| 国产精品网红福利| 亚洲a在线播放| 欧美一级视频一区二区| 亚洲在线观看视频| 亚洲香蕉av在线一区二区三区| 久久伊人色综合| 国产精品啪视频| 国产成人免费av电影| 一区二区欧美亚洲| 性欧美长视频免费观看不卡| 亚洲精品少妇网址| 国内伊人久久久久久网站视频| 国产精品美女在线观看| 国产欧美一区二区| 亚洲va久久久噜噜噜久久天堂| 美女视频久久黄| 在线观看日韩专区| 午夜精品久久久99热福利| 国产精品久久久久久亚洲调教| 国产脚交av在线一区二区| 成人久久一区二区三区| 亚洲色图15p| 日韩精品视频免费在线观看| 国产精品av网站| 这里只有精品在线播放| 国产性猛交xxxx免费看久久| 久久天天躁狠狠躁老女人| 亚洲变态欧美另类捆绑| 亚洲女人天堂网| 国产精品入口免费视频一| 欧美日韩福利在线观看| **欧美日韩vr在线| 中文字幕日韩欧美在线视频| 亚洲社区在线观看| 亚洲欧美三级在线| 欧美老女人性视频| 亚洲va久久久噜噜噜| 国模精品系列视频| 欧美日韩一区二区三区在线免费观看| 亚洲高清免费观看高清完整版| 丝袜美腿精品国产二区| 国产精品视频播放| 亚洲综合av影视| 日韩经典第一页| 午夜欧美大片免费观看| 日韩av影院在线观看| 久久久久国产精品一区| 久久久这里只有精品视频| 欧美高清一级大片| 日韩欧美一区二区三区| 95av在线视频| 成人午夜两性视频| 日本韩国在线不卡| 久久久久久成人| 中文字幕一区日韩电影| 九九精品在线观看| 欧美性猛交xxxx| 亚洲天堂久久av| 亚洲成人1234| 夜夜嗨av一区二区三区四区| 久久影院在线观看| 国产精自产拍久久久久久| 97视频在线观看免费高清完整版在线观看| 国产精品视频一区国模私拍| 国模叶桐国产精品一区| 欧美午夜精品伦理| 欧美成人免费一级人片100| 国产黑人绿帽在线第一区| 国产999精品久久久| 一区二区国产精品视频| 日韩亚洲欧美中文高清在线| 久久久爽爽爽美女图片| 日韩av中文字幕在线播放| 欧美高清第一页| 国产国语videosex另类| 欧美激情性做爰免费视频| 7777精品视频| 欧美日韩性视频在线| 亚洲国产一区二区三区四区| 在线看日韩av| 亚洲a级在线播放观看| 成人高h视频在线| 亚洲丁香婷深爱综合| 成人激情av在线| 色妞欧美日韩在线| 亚洲视频在线观看免费| 成人春色激情网|