麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 麻豆视频在线观看免费网站 | 国产成年人视频 | 国产精品视频yy9299一区 | 高清视频一区二区 | 精品一区二区三区日本 | 成人福利电影在线观看 | 美女黄影院| 91在线精品亚洲一区二区 | 欧美日韩精品中文字幕 | 毛片福利| 欧美成人免费 | 国产精品99久久久久久久女警 | 久久亚洲视频网 | 国产精品一区网站 | 国产毛片网 | 亚洲99 | 久草在线手机视频 | 9丨九色丨国产 | 91伊人久久 | 久久久www成人免费毛片 | 久久久久久久91 | 午夜小视频免费观看 | 黄色片一区二区 | videos高潮| videos真实高潮xxxx | 九九热九九爱 | 国产污污视频 | 毛片免费看电影 | 欧美一级美国一级 | 亚洲男人一区 | 久久亚洲精品久久国产一区二区 | 国产精品99精品 | 国产羞羞视频在线免费观看 | 国产一区在线视频观看 | 姑娘第四集免费看视频 | 亚洲午夜在线 | 国产网站黄 | 日本在线精品视频 | 日本在线播放一区 | 国产九九热视频 | 日韩视频一 |